我的代码有效,但我很难与为什么建立联系。
我在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
答案 0 :(得分:1)
如果webServerName
正在呈现正在向webServerName
发送异步请求的HTML页面,则CORS
不适用,并且您的服务器无论如何都将提供该资源。
我很确定一定是你的情况。
根据问题的最新编辑以及OP对此答案的评论,这是必须发生的事情。
它为主HTML页面和API资源提供服务的HTTP服务器是相同的,因此不需要EnableCORS
。但是,根据Request
的标题,http://fs-6103
正在投放网页,而$http.get
正在http://fs-6103.fs.local
投放。这应该解释一切。
好的,我愿意打赌这就是这里发生的事情:
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源资源与我同在。”浏览器通常会与之一致。