Http.post 请求的资源上不存在“Access-Control-Allow-Origin”标头

Posted

技术标签:

【中文标题】Http.post 请求的资源上不存在“Access-Control-Allow-Origin”标头【英文标题】:Http.post No 'Access-Control-Allow-Origin' header is present on the requested resource 【发布时间】:2015-12-21 12:34:00 【问题描述】:

所以我试图从 Angular 向我的 MVC 帐户控制器调用 http.post 请求来执行 externallogin 方法。我不断收到错误消息“请求的资源上不存在‘Access-Control-Allow-Origin’标头。”所以我做了一些挖掘,似乎它与 CORS 有关。

 var chrome = 100;
    var width = 500;
    var height = 500;
    var left = (screen.width - width) / 2;
    var top = (screen.height - height - chrome) / 2;
    var options = "status=0,toolbar=0,location=1,resizable=1,scrollbars=1,left=" + left + ",top=" + top + ",,about:blank", "login-popup", options);

    authService.externalLogin(provider, returnUrl).then(function (response) 

    )

var _externalLogin = function (provider, returnUrl) 
    _logOut();
    var deferred = $q.defer();
    $http.post(
'/Account/ExternalLogin', 
    provider: provider,
    ReturnUrl: returnUrl
).success(function (response) 
deferred.resolve(response);).error(function (err, status) 
_logOut();
deferred.reject(err););
    return deferred.promise;
;

所以这会进入控制器并创建相应的路径。但是当它完成该方法时,它会在不重定向打开的窗口的情况下产生错误。

我尝试使用 http://www.html5rocks.com/en/tutorials/cors/ 实现 CORS,但没有任何改变。有人能解释一下如何解决这个问题吗?

【问题讨论】:

您是否在我们的服务器上启用了 Access-Control-Allow-Origin: * 【参考方案1】:

尝试在您的发布请求中设置一些标题。例如,您可以进行一些自定义:

app.run(function ($http) 
  // Sends this header with any AJAX request
  $http.defaults.headers.common['Access-Control-Allow-Origin'] = '*';
  // Send this header only in post requests. Specifies you are sending a JSON object
  $http.defaults.headers.post['dataType'] = 'json'
);

希望这会有所帮助!

编辑:以下似乎有效(阅读下面的 cmets):

$http( 
  url: '/Account/ExternalLogin', 
  dataType: 'json', 
  method: 'POST', 
  data:  
    provider: provider, 
    ReturnUrl: returnUrl 
  
);

【讨论】:

所以我尝试像您提供的那样在服务 js 文件中添加它,但没有运气。给了我同样的错误...我只是将这些标题添加到错误的位置吗? 你很好,这应该在你的app.js 上,但只要它包含在你的主 HTML 文件中,位置就无关紧要了。这可能是一件很难调试的事情。另外两件事要尝试:确保您从服务器(本地主机)运行 Angular 应用程序,而不是仅从文件系统打开 .html 文件。其次,尝试同时指定$http.defaults.headers.post['Content-Type'] = 'application/json' 或您发送的任何内容。 哦!还有一件非常重要的事情!确保您也在发布请求中发送数据!像这样 $http( url: '/Account.ExternalLogin', dataType: 'json', method: 'POST', data: provider: provider, ReturnUrl: returnUrl, , headers: "Content-Type": "应用程序/json" 嗯。所以如果我进行以下更新,我会得到同样的错误。我认为 $http.post 和您的方法没有什么不同,因为它能够到达控制器。在控制器运行之后,使用了 dispose 方法,这就是它得到错误的地方。我尝试将自定义标头添加到 Web.Config 文件中,但也没有运气。谢谢! 嘿嘿让它工作了。包括您的更新后,我发现了一些拼写错误,这真的把我搞砸了。谢谢

以上是关于Http.post 请求的资源上不存在“Access-Control-Allow-Origin”标头的主要内容,如果未能解决你的问题,请参考以下文章

HTTP POST 请求在 3G 上不起作用

django中的“请求的资源上不存在'Access-Control-Allow-Origin'标头”

如何解决请求的资源上不存在“Access-Control-Allow-Origin”标头

请求的资源发布请求上不存在“Access-Control-Allow-Origin”标头

Angular 2请求的资源上不存在“Access-Control-Allow-Origin”标头[重复]

Ionic/Angular HTTP post 请求在 android 上不起作用