2014-12-05 2 views
16

есть 100 вопросов о CORS на web-api, а также о том, как включить CORS, есть другой ответ, который каждый из них предоставляет. Я настолько смущен и не знаю, какой ответ правильный. И проблема в том, что ни один из ответов на самом деле не объясняет, насколько это важно, каждая строка кода, чтобы я мог понять и решить мою проблему, а не копировать код.owin cors или web api cors

в любом случае, вопрос: я использую asp.net web api 2 используя owin. И мне нужно включить CORS. как мне это сделать? Существует CORS настройки Owin

application.UseCors(CorsOptions.AllowAll); 

и есть CORS настройки для ASP.NET Web API

var cors = new EnableCorsAttribute("*", "*", "*", "*"); 
    config.EnableCors(cors); 

который один я должен использовать предоставленные ему я не использую OAuth (я задающие это потому, что ответы на SO отличаются тем, что мы используем OAUTH v/s, когда мы его не используем).

Нужно ли включать CORS для OWIN & WEB-API или только для одного из них. Существует проблема, если оба включены, read here

Было бы очень полезно, если кто-то может объяснить мне разницу между

  1. Owin CORS
  2. WEB API CORS
  3. CORS с OAuth с помощью Owin/WebAPI

Также есть ответы на самообслуживаемые веб-api против owin, размещенные в web-api, что дополнительно добавляет к confution :(, извините за напыщенность

+0

Согласен, наверняка будет набухать, если у кого-то есть объяснение, не будучи расплывчатым. – Nicholi

+1

Я все еще ищу ответ. Ответы даны неполными, а не точными. Я не ищу, как это сделать, то есть так много других ответов – harishr

ответ

8

Вы должны использовать Web API's CORS, если вам нужно CORS примененные к API контроллеров. Для всего остального (например, токена) вы застряли в использовании Owin.Cors.

Если вы в конечном итоге используете оба варианта, вам необходимо убедиться, что они не перекрываются, и нанесите CORS дважды на тот же запрос.

Web API 2.2 позволяет легко включить CORS, предоставив EnableCorsAttribute.

Основы использования

[EnableCors("*", "*", "*")] 
public class ResourcesController : ApiController 
{ 
    ... 

определение Атрибут

[AttributeUsageAttribute(AttributeTargets.Class|AttributeTargets.Method, AllowMultiple = false)] 
public EnableCorsAttribute(
    string origins, 
    string headers, 
    string methods 
) 

Чтобы включить CORS глобально использовать

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     var cors = new EnableCorsAttribute("www.example.com", "*", "*"); 
     config.EnableCors(cors); 
     // ... 
    } 
} 

Вам также потребуется установить пакет CORS из NuGet

Install-Package Microsoft.AspNet.WebApi.Cors 
+0

Я знаю, как включить cors в web-api, что я хочу знать, разница между web-api и owin cors, которые следует использовать, когда , его не о том, как/где его включить .... – harishr

+0

CORS C API поддерживает только контроллеры, для всего остального вам нужно использовать Owin.Cors. –

+1

Что такое 'все остальное' – harishr

-1

Есть способ исправить это. Поскольку библиотеки OWIN и ASP.NET.CORS работают одновременно. Oken-токен или метод аутентификации необходимо настроить для включения CORS отдельно от всех других контроллеров API.

Кулак вещь первая, не используйте CORS с Owin в Startup.cs:

public void Configuration(IAppBuilder app) 
{ 
    //app.UseCors(CorsOptions.AllowAll); 

Найти метод GrantResourceOwnerCredentials и добавить Access-Control-Allow-Origin в контексте так, когда он возвращает вызов после аутентификации завершено, что браузер находит заголовок и принимает его.

public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context) 
{ 
     context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "http://localhost" }); 

Теперь установите Microsoft.AspNet.WebApi.Cors пакет от NuGet к вашему WebAPI проекта, и добавить к регистрировать метод

public static void Register(HttpConfiguration config) 
{ 
     var cors = new EnableCorsAttribute("http://localhost, ", "accept,accesstoken,authorization,cache-control,pragma,content-type,origin", "GET,PUT,POST,DELETE,TRACE,HEAD,OPTIONS"); 

     config.EnableCors(cors); 

работал для меня.