2016-08-26 4 views
1

Я использую Microsoft.AspNet.WebApi V5.2.3, Microsoft.Owin.Host.HttpListener 3.0.1. Начало работы со следующей конфигурацией:WebAPI OWIN SelfHosting Поддержка CORS

public void Configuration(IAppBuilder appBuilder) 
{ 
    HttpConfiguration config = new HttpConfiguration(); 
    config.MapHttpAttributeRoutes(); 

    appBuilder.UseWebApi(config); 
} 

и класс API контроллера объявляется с использованием:

[EnableCors("*", "*", "*")] 
public class CWebAPIController : ApiController 
{ 
    [Route("API/System/Login"), HttpGet] 
    public IHttpActionResult Login(string UserID, string Password) 
    { 
     .... bla bla bla ..... 
    } 
} 

Я могу ссылаться на API выше, с использованием HttpClent на том же компьютере, но если я пытаюсь вызвать API с другого компьютера (в пределах одной подсети), я получил ответ 400 BadRequest.

Я считаю, что это проблема CORS, но могу ли я знать, как я могу это решить. Поиск в google дает много результатов, и существует так много версий/реализации WebApi, что я не знаю, какой из них правильный, пробовав один целый день.

Заранее спасибо

ответ

0

Вы должны принести в пакете Microsoft.Owin.Cors, и, возможно, пакет Microsoft.AspNet.Cors в свой проект и инициализировать CORS в вашем Startup классе, как это:

var corsPolicy = new CorsPolicy 
      { 
       AllowAnyHeader = true, 
       AllowAnyMethod = true, 
       AllowAnyOrigin = true, 
       SupportsCredentials = true 
      }; 
      corsPolicy.ExposedHeaders.Add("x-markit-currentpage"); 
      corsPolicy.ExposedHeaders.Add("x-markit-totalpages"); 
      corsPolicy.ExposedHeaders.Add("x-markit-totalresults"); 
      app.UseCors(new CorsOptions 
      { 
       PolicyProvider = new CorsPolicyProvider { PolicyResolver = context => Task.FromResult(corsPolicy) } 
      }); 
0

Атрибут EnableCors должен работать на вашем контроллере API. В качестве альтернативы вы можете сделать одно из следующих действий.

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

appBuilder.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll); 

Else, если вы хотите иметь контроль над которой домен/компьютеры, чтобы позволить затем использовать

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

Вы будете необходимо установить пакет Microsoft.Owin.Cors.

0

Для самостоятельного хостинга нам нужно выполнить приведенную ниже команду в режиме администратора.

netsh http add urlacl url=http://+:<port>/ user=<user id> 
1

Я добавил CORS так:

public void Configuration(IAppBuilder app) 
    { 
     var config = ConfigureApi(); 
     app.UseWebApi(config); 
    } 
    private HttpConfiguration ConfigureApi() 
    { 

     var config = new HttpConfiguration(); 
     config.Routes.MapHttpRoute(
      "DefaultApi", 
      "{controller}/{action}/{id}", 
      new { id = RouteParameter.Optional }); 
     config.MessageHandlers.Add(new CorsMessageHandler()); 
     return config; 
    } 

CorsMessageHandler присутствует здесь: https://github.com/Microsoft/FetchClimate/blob/master/src/Service/Frontend/CORS/CorsMessageHandler.cs

Надеется, что это будет работать.

Смежные вопросы