关于CORS和Ajax调用的基本误区

时间:2014-10-31 17:37:36

标签: c# asp.net angularjs asp.net-web-api cors

我的代码有效,但我很难与为什么建立联系。

我在AngularJS工厂函数中有代码进行此调用:

$http.get('http://webServerName/PrestoWebApi/api/apps/')

这是Web API控制器(C#):

[EnableCors(origins: "http://webServerName", headers: "*", methods: "*")]
public class AppsController : ApiController

通话来源是用户的计算机,例如名为 JoesLaptop 的笔记本电脑。那台笔记本电脑可以随处运行。 (目前,这一切都在一个局域网内运行,但用户可以在任何地方。)

那么为什么在EnableCors属性中指定 Web服务器名称有效呢?请问来自Joe的笔记本电脑上的浏览器,而不是来自Web服务器本身?

修改

如果我删除EnableCors属性,我会在浏览器的F12工具中收到此错误:

XMLHttpRequest无法加载http://webServerName/PrestoWebApi/api/apps/。 No' Access-Control-Allow-Origin'标头出现在请求的资源上。因此,不允许原点'http://webServerName'访问。

修改2

请求:

GET http://fs-6103.fs.local/PrestoWebApi/api/apps/ HTTP/1.1
Host: fs-6103.fs.local
Connection: keep-alive
Accept: application/json, text/plain, */*
Origin: http://fs-6103
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.111 Safari/537.36
Referer: http://fs-6103/PrestoWebApi/app/
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8

响应:

HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-Type: application/json; charset=utf-8
Expires: -1
Server: Microsoft-IIS/7.5
Access-Control-Allow-Origin: http://fs-6103
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Fri, 31 Oct 2014 18:30:05 GMT
Content-Length: 2931171

2 个答案:

答案 0 :(得分:1)

如果webServerName正在呈现正在向webServerName发送异步请求的HTML页面,则CORS不适用,并且您的服务器无论如何都将提供该资源。

我很确定一定是你的情况。

更新

根据问题的最新编辑以及OP对此答案的评论,这是必须发生的事情。

它为主HTML页面和API资源提供服务的HTTP服务器是相同的,因此不需要EnableCORS。但是,根据Request的标题,http://fs-6103正在投放网页,而$http.get正在http://fs-6103.fs.local投放。这应该解释一切。

更新2

好的,我愿意打赌这就是这里发生的事情:

  • 主页面由http://fs-6103
  • 提供
  • $http.get面向:http://fs-6103.fs.local/

到目前为止,我没有推测,这就是请求的意思

OP必须将[EnableCors(origins: "http://fs-6103", headers: "*", methods: "*")]设置到API控制器中。

当禁用此功能时,OP会收到错误:No 'Access-Control-Allow-Origin' header is present on the requested resource,因为它应该是预期的。当OP启用它时,一切都按预期工作。

答案 1 :(得分:0)

浏览器/客户端处理安全性,并且通常将事物限制为单一来源,这意味着它们只接受来自他们发出请求的服务器的内容。在标题中启用cors(ACAO)或允许该服务器告诉浏览器的任何地方,“嘿,那些其他Cross源资源与我同在。”浏览器通常会与之一致。