【问题标题】:How to enable Cross Domains in ASP.NET Web api + Angular如何在 ASP.NET Web api + Angular 中启用跨域
【发布时间】:2016-12-21 10:03:40
【问题描述】:

我的项目是:ASP.NET Web Api C# With Angular

我正在尝试使用允许来自 Angular 客户端的跨域进行简单的 http 获取

请求:

$http.defaults.headers.common['X-Auth-Key'] = 'somekey';
$http.defaults.headers.common['X-Auth-Email'] = 'someuser';
$http.defaults.headers.common['Access-Control-Allow-Origin'] = '*';
$http.defaults.headers.common['Access-Control-Allow-Methods'] = 'GET, POST, PUT, DELETE, OPTIONS';
return {
    GetDomains: function () {
      return  $http({
          method: "get",
          url: "https://api.cloudflare.com/client/v4/zones/cd7d068de3012345da9420df9514dad0/dns_records?page=3&per_page=20&order=type&direction=asc",
          responseType: 'json'
        }).then(function mySucces(response) {
            return response.data;
        })
    }
}
});

在回复中我可以看到:

access-control-request-headers:access-control-allow-methods、access-control-allow-origin、x-auth-email、x-auth-key

和错误:

XMLHttpRequest 无法加载 https://api.cloudflare.com/client/v4/zones/cd7d068de3012345da9420df9514dad0/dns_records?page=3&per_page=20&order=type&direction=asc。对预检请求的响应未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头。因此,Origin 'http://localhost' 不允许访问。响应的 HTTP 状态代码为 400。

我正在尝试使用带有 Visual Studio 2015 的 iis express 来做到这一点

IIS Express applicationhost.config 和 Web.Config 文件有:

    <httpProtocol>
        <customHeaders>
            <clear />
            <add name="X-Powered-By" value="ASP.NET" />
                <add name="Access-Control-Allow-Origin" value="*" />
                <add name="Access-Control-Allow-Headers" value="Accept, X-Access-Token, X-Application-Name, X-Request-Sent-Time"/>
                <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS"/>
                <add name="Access-Control-Allow-Credentials" value="true"/>
        </customHeaders>
        <redirectHeaders>
            <clear />
        </redirectHeaders>
    </httpProtocol>

App_Start / WebApiConfig.cs 文件:

         var corsAttr = new EnableCorsAttribute("https://api.cloudflare.com", "*", "*");
        config.EnableCors(corsAttr);

还是同样的错误

我什么都试过了 也许你可以帮助我

谢谢!

【问题讨论】:

    标签: asp.net angularjs asp.net-web-api cross-domain


    【解决方案1】:

    您需要按照本文所述在 WebApi 后端启用 CORS:

    Enabling Cors

    必要的部分是用这个commamd为cors安装包:

    Install-Package Microsoft.AspNet.WebApi.Cors
    

    然后将所需的方法添加到您的 Startup/WebConfig

    using System.Web.Http;
    namespace WebService
    {
        public static class WebApiConfig
        {
            public static void Register(HttpConfiguration config)
            {
                // New code
                config.EnableCors();
    
                config.Routes.MapHttpRoute(
                    name: "DefaultApi",
                    routeTemplate: "api/{controller}/{id}",
                    defaults: new { id = RouteParameter.Optional }
                );
            }
        }
    }
    

    然后,您需要在应用范围内或特定于您的控制器中启用 Cors:

    [EnableCors(origins: "*", headers: "*", methods: "*")]
    public class TestController : ApiController
    {
        // Controller methods not shown...
    }
    

    要全局启用 CORS,您需要创建一个 Cors 配置,如下例所示:

    public static void Register(HttpConfiguration config)
    {
        var cors = new EnableCorsAttribute("www.example.com", "*", "*");
        config.EnableCors(cors);
        // ...
    }
    

    【讨论】:

    • 抱歉忘记添加它,但我已经配置了 EnableCors globaly 查看我的更新
    • 您是否完全按照您所写的方式添加了此属性,或者这是一个错字?因为如果需要启用的域是 api.cloudflare.com 并且您想在来自该站点的所有请求上启用它,您需要编写 config.EnableCors(new EnableCorsAttribute("api.cloudflare.com", "*", "*"); 。如果您忘记了通配符,您将无法连接。另外,根据您写的问题,我认为您的来源是 localhost 所以您至少也必须将其启用为允许的 CORS 来源,因为来源是来自调用客户端的地址。
    • 哇老兄,这完全解决了我的 CORS 问题。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-13
    • 2016-06-30
    • 2023-03-09
    • 2017-05-03
    • 1970-01-01
    • 1970-01-01
    • 2017-03-26
    相关资源
    最近更新 更多