【问题标题】:web api 2 cors not workingweb api 2 cors 不工作
【发布时间】:2018-03-21 19:54:59
【问题描述】:

我在 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”标头。因此,Origin 'http://localhost:12012' 不允许访问。响应的 HTTP 状态代码为 404。

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

更新.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);
            }

        }

但是得到一个错误:请求头字段 Content-Type 在预检响应中被 Access-Control-Allow-Headers 不允许。

【问题讨论】:

  • 您确定这不在选项请求中吗?
  • 如果是,有什么区别?在这种情况下如何启用它?
  • 尝试将 EnableCors 移到方法的顶部,在一切之前。

标签: angular asp.net-web-api


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    你可以试试下面的 nuget

    Nuget for CORS

    【讨论】:

      猜你喜欢
      • 2014-09-17
      • 2017-07-09
      • 1970-01-01
      • 2015-11-18
      • 2015-12-28
      • 2017-07-05
      • 1970-01-01
      • 2017-04-28
      • 1970-01-01
      相关资源
      最近更新 更多