首页 文章

web api 2 cors不工作

提问于
浏览
2

我在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);
    }
}

但我仍然在浏览器中出错 .

因此,不允许对预检请求的响应进行访问 - 控制 - 允许 - 原点' header is present on the requested resource. 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

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

  • 0

    你可以试试下面的nuget

    Nuget for CORS

相关问题