Angular/C# CORS 问题

Posted

技术标签:

【中文标题】Angular/C# CORS 问题【英文标题】:Angular/C# CORS Issue 【发布时间】:2015-08-23 13:52:33 【问题描述】:

我将客户端托管在 localhost:8080/ 上,服务器托管在 localhost:44302/ 上

我正在尝试链接到我的后端,但遇到了 CORS 问题。下面是我的 Angular http 请求

$http.post(url, data, 
    headers: 
                    'Content-Type': 'application/x-www-form-urlencoded',
                    'Access-Control-Allow-Origin': '*',
                    'Access-Control-Allow-Methods': 'POST, OPTIONS'
             
).success(function (response) 
  // rest of the code
).error(function (err, status) 
  // rest of the code
);

在用 C# 编写的服务器端,我在响应中设置了以下内容

 Response.ContentType = "application/json";
 Response.AddHeader("Access-Control-Allow-Origin", "*");
 Response.AddHeader("Access-Control-Allow-Methods", "POST, OPTIONS");

即使设置了这些,我也收到以下错误

XMLHttpRequest 无法加载 https://localhost:44302/some_uri。 请求中不存在“Access-Control-Allow-Origin”标头 资源。因此不允许使用原点“http://localhost:8080” 使用权。响应的 HTTP 状态代码为 400。

我错过了什么?

【问题讨论】:

你用什么做后端? ASP.NET Web API?你把修改响应的代码放在哪里了? 是的,我正在使用 ASP.NET MVC,我将代码放在控制器中,从那里我将响应发回 【参考方案1】:

您不需要从 AngularJS 发送任何额外的标头。系统会自动为您发出预检请求。

要在 Web API 中启用所有跨域请求,您可以这样做:

    安装 NuGet 包 Microsoft.AspNet.WebApi.Cors。

    将以下代码添加到 WebApiConfig.cs:

        var corsAttr = new EnableCorsAttribute("*", "*", "*");
        config.EnableCors(corsAttr);
    

完全了解 CORS 值得花几分钟时间。我建议在这里阅读深入的教程:

http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api

【讨论】:

虽然我不需要它来解决我的解决方案,但我会接受它,因为它为其他人提供了明确的解决方案。就我而言,我在某处使用了正确的 IP 而不是 localhost,并且由于一些 Microsoft 奇怪的 IP 问题,我看不到它。【参考方案2】:

在您的应用程序级服务器端执行此操作 您的客户端应用程序无需更改

第 1 步:安装包 Microsoft.AspNet.WebApi.Cors

第 2 步:您可以从 HttpConfiguration 对象启用 cors - 适用于整个应用程序

public static void Register(HttpConfiguration config)
    
        // New code
        config.EnableCors();

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

替代

第 3 步:转到控制器添加以下属性 - 仅适用于 TestController

// Allow CORS for all origins. (Caution!)
[EnableCors(origins: "*", headers: "*", methods: "*")]

示例

[EnableCors(origins: "http://mywebclient.azurewebsites.net", headers: "*", methods: "*")]
public class TestController : ApiController

    // Controller methods not shown...

【讨论】:

以上是关于Angular/C# CORS 问题的主要内容,如果未能解决你的问题,请参考以下文章

Angular 打字稿异步 HTTPClient 调用

为啥在尝试升级 Angular 时出现“没有导出成员”错误?

启用 CORS 时出现 Spring/Angular CORS 问题 [重复]

即使在设置 CORS 标头和服务器响应之后,Angular 和 laravel 的 CORS 问题[重复]

Angular $resource 和自托管 WebAPI 的 CORS 问题

导入的类不能在带有 TypeScript 的 Angular.js 中用作服务