2017-10-10 100 views
2

我在Web API上创建一个Web服务,并尝试从angular 2应用程序使用它。 我安装Microsoft.AspNet.WebApi.Core 5.2.3并将其配置为允许cors。 它托管在本地IIS位于localhost/RestfulAPIweb api 2 cors不工作

WebApiConfig

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 

     // Web API routes 
     config.MapHttpAttributeRoutes(); 

     config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{controller}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
     ); 

     config.Routes.MapHttpRoute(
      name: "DefaultApi 2", 
      routeTemplate: "api/{controller}/{action}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
     ); 

     var cors = new EnableCorsAttribute("*", "*", "*"); // origins, headers, methods 
     config.EnableCors(cors); 
    } 
} 

控制器

[HttpGet] 
[Route("api/product/details")] 
public async Task<IHttpActionResult> GetProductsDetails([FromUri]ProductSearch model) 
{ 
    using (var unitOfWork = Factory.Create()) 
    { 
     var products = (from p in await unitOfWork.GetProductsAsync(model?.CategoryID, model?.BrandID, model?.ProductStateID, null, model?.PartnerID, 
        true, model?.Code) 
      orderby p.Code 
      select p).ToArray(); 
     return return Json(products); 
    } 
} 

但我仍然得到错误的浏览器。

对预检请求的响应未通过访问控制检查:请求的资源上没有“Access-Control-Allow-Origin”标头。因此不允许访问原产地'http://localhost:12012'。该响应具有HTTP状态代码404.

这怎么可能,我启用所有Cors,但它仍然不工作?

Upd.1。 我试着处理一个选项要求如波纹管

public class PreflightRequestsHandler : DelegatingHandler 
     { 
      protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) 
      { 
       if (request.Headers.Contains("Origin") && request.Method.Method.Equals("OPTIONS")) 
       { 
        var response = new HttpResponseMessage { StatusCode = HttpStatusCode.OK }; 
        // Define and add values to variables: origins, headers, methods (can be global)    
        response.Headers.Add("Access-Control-Allow-Origin", "*"); 
        response.Headers.Add("Access-Control-Allow-Headers", "*"); 
        response.Headers.Add("Access-Control-Allow-Methods", "*"); 
        var tsc = new TaskCompletionSource<HttpResponseMessage>(); 
        tsc.SetResult(response); 
        return tsc.Task; 
       } 
       return base.SendAsync(request, cancellationToken); 
      } 

     } 

但得到一个错误:请求头字段内容类型不受接入控制允许的报头预检响应允许。

+0

您确定这不是选项要求吗? –

+0

如果它是什么区别?以及如何在这种情况下启用它? –

+0

尝试将EnableCors移到方法的顶部,然后再放在一切之前。 – jpgrassi

回答

0

确保您使用的是Api控制器,而不是从Apicontroller类继承的普通控制器。 我有同样的问题,然后我想通了,我使用普通的控制器,我纠正它,我无法访问和从api控制器获取数据。