CORS 不起作用 MVC6 - RC1

Posted

技术标签:

【中文标题】CORS 不起作用 MVC6 - RC1【英文标题】:CORS does not work MVC6 - RC1 【发布时间】:2016-04-22 11:17:06 【问题描述】:

在 MVC6 应用中启用了 CORS,并且启动看起来像:

我在ConfigureServices() 方法中添加了以下代码:

services.AddCors(options =>
    
        options.AddPolicy("AllowSpecificOrigin",
            builder => builder.AllowAnyOrigin().AllowAnyHeader().AllowAnyMethod().AllowCredentials());
    );

…… 在配置Configure()

app.UseCors("AllowSpecificOrigin");

.......

我的代码尝试从另一个 url 下载 angular 模板,模板被下载(在 fiddler 中看到)。但是我的浏览器控制台说

XMLHttpRequest 无法加载 http://hsa-is-utl32.[mydomain].com/LayoutService//platform/templates/layout/topbanner.html。请求的资源上不存在“Access-Control-Allow-Origin”标头。因此,Origin 'http://mydevbox.[mydomain].com' 不允许访问。

不知道怎么了??

【问题讨论】:

您应该包含更多您使用的完整代码。例如,包含中间件的顺序 Configure 很重要。我的意思是app.UseCors("AllowSpecificOrigin"); 应该被称为不晚。其次,您应该写下您使用的 Angular 版本以及 $http 调用和 app.config(function($httpProvider) ... 的外观。需要配置$http 以在Ajax 请求中包含Access-Control-Allow-Origin。请参阅withCredentials: true$httpProvider.defaults.useXDomain = true;delete $httpProvider.defaults.headers.common['X-Requested-With']; 等。 没用,我的角度配置看起来像:platform.config(["$provide", "$sceDelegateProvider", "$httpProvider", function ($provide, $sceDelegateProvider, $httpProvider) $provide.constant('rootUrl', rootUrl); $sceDelegateProvider.resourceUrlWhitelist([ 'self', 'http://*.[domain].com/**', 'http://*.[domain] .gov/**' ]); $httpProvider.defaults.headers.common['Access-Control-Allow-Origin'] = true; $httpProvider.defaults.useXDomain = true; ]); app.UseCors("AllowSpecificOrigin") 是 Configure() 方法中的第一个语句.... 我的应用程序从另一个域下载 angular directiv js 文件,并且 angular 模板文件与 js 文件一起定位,但是当 angular 尝试下载模板时会产生错误。 您应该使用Fiddler 或 IE/Chrome 的开发者工具来查看 HTTP 流量并查看 Angular 发送的请求的所有 HTTP 标头。如果 X-Requested-With 将被设置,那么你应该删除它(见上面的评论)。 【参考方案1】:

尼克的 web.config sn-p 为我工作。我有两个在 localhost IIS Express 上运行的应用程序的类似情况。它在 Startup.cs 中没有 app.UseCors("AllowSpecificOrigin") 的情况下工作。

<configuration>
    <system.webServer>
        <httpProtocol>
            <customHeaders>
                <add name="Access-Control-Allow-Origin" value="http://localhost:10001" />
            </customHeaders>
        </httpProtocol>
    </system.webServer>
</configuration>

【讨论】:

【参考方案2】:

我遇到了类似的问题。不能 100% 确定您的设置是什么样的,但也许这会有所帮助。假设我有两个域,我的应用程序所在的 http://myapp.domain/ 和模板所在的 http://templates.domain/template.html。这就是我所做的。

这将为 MVC 6 应用程序 (myapp.domain) 设置 CORS。

public void ConfigureServices(IServiceCollection services)

    services.AddCors(options =>
    
        options.AddPolicy("AllowSpecificOrigin",
                builder => builder.WithOrigins("http://myapp.domain").AllowAnyHeader().AllowAnyMethod().AllowCredentials());
    );

    services.AddMvc();


public void Configure(IApplicationBuilder app)

    app.UseIISPlatformHandler();
    app.UseDefaultFiles();
    app.UseStaticFiles();
    app.UseCors("AllowSpecificOrigin");
    //make sure its before UseMvc()!!
    app.UseMvc();

然后我在http://templates.domain 的wwwroot 中设置我的web.config 文件,以允许来自http://myapp.domain/ 的CORS。这包括静态文件,例如从不同域引用 Angular 模板。

<configuration>
  <system.webServer>
    <httpProtocol>
      <customHeaders>
        <add name="Access-Control-Allow-Origin" value="http://myapp.domain" />
      </customHeaders>
    </httpProtocol>
  </system.webServer>
</configuration>

从那时起就很简单了,假设出于某种原因您想从不同的域中获取路由模板,您可以这样做:

(function () 
    "use strict";

    var app = angular.module("myApp", ['ngRoute']);

    // configure the routes
    app.config(['$provide', '$sceDelegateProvider', '$routeProvider', '$locationProvider', '$httpProvider',
        function ($provide, $sceDelegateProvider, $routeProvider, $locationProvider, $httpProvider) 

            $sceDelegateProvider.resourceUrlWhitelist(['self', 'http://templates.domain/**']);
            $httpProvider.defaults.headers.common['Access-Control-Allow-Origin'] = true;
            $httpProvider.defaults.useXDomain = true;

            //routes
            $routeProvider.when('/', 
                templateUrl: 'http://templates.domain/template.html',
                controller: 'templatesController'
            )
            .otherwise( redirectTo: '/' );

            $locationProvider.html5Mode(true);

            $httpProvider.defaults.headers.common = 
                'Content-Type': 'application/json, charset=UTF-8'
            ;
        ]);

    app.controller('templatesController', ['$scope', function ($scope) 
        $scope.message = 'message from controller';
    ]);

)();

在您的 html 中添加 &lt;div ng-view&gt;&lt;/div&gt; 并包含 angular-routes

现在,当您在 Angular 应用中调用模板时,您应该会在响应标头中看到这一点。

访问控制允许来源:http://myapp.domain/

我希望这会有所帮助。

【讨论】:

感谢您的评论://确保它在 UseMvc() 之前!这很重要!【参考方案3】:

我建议检查从 MVC 应用程序返回的标头。请记住,如果您设置了 AllowCredentials,则不能使用 Access-Control-Allow-Origin=*。

尝试从 MVC 应用程序中删除最后一个配置(我的意思是这个)。

.AllowCredentials());

如果你想设置credentials,我相信你必须设置Access-Control-Allow-Origin='访问此站点的应用的URL'

您还应该使用 Fiddler 检查响应,看看出了什么问题。

【讨论】:

删除了 .AllowCredentials() 部分,但它不起作用:(

以上是关于CORS 不起作用 MVC6 - RC1的主要内容,如果未能解决你的问题,请参考以下文章

飞镖 CORS 不起作用

弹簧靴。 CORS。 'allowCredentials = false' 不起作用

CORS 配置不起作用

带有 Spring 的 CORS 不起作用

带有 XMLHttpRequest 的 CORS 不起作用

AngularJS和rails cors标头不起作用