web api 2 cors不工作

时间:2017-10-10 11:59:34

标签: angular asp.net-web-api

我在Web API上创建一个Web服务,并尝试从angular 2应用程序中使用它。 我安装了Microsoft.AspNet.WebApi.Core 5.2.3并将其配置为允许使用cors。 它托管在localhost / RestfulAPI

的本地IIS上

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.

怎么可能,我启用了所有的角色,但它仍然不起作用?

Upd.1。 我尝试处理像bellow

这样的选项请求
 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);
            }

        }

但是出现错误:请求标头字段在预检响应中,Access-Control-Allow-Headers不允许使用Content-Type。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

您可以尝试以下nuget

Nuget for CORS