关于CORS和Ajax调用的根本误解

本文关键字:误解 调用 CORS Ajax 关于 | 更新日期: 2023-09-27 18:28:50

我有可以工作的代码,但我很难连接为什么可以工作。

我有一个AngularJS工厂函数中的代码,可以进行以下调用:

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

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

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

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

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

编辑

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

XMLHttpRequest无法加载http://webServerName/PrestoWebApi/api/apps/。请求的资源上不存在"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

关于CORS和Ajax调用的根本误解

如果webServerName正在呈现一个HTML页面,该页面正在启动对webServerName的异步请求,那么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必须在API控制器中设置[EnableCors(origins: "http://fs-6103", headers: "*", methods: "*")]

禁用此选项后,OP将得到错误:No 'Access-Control-Allow-Origin' header is present on the requested resource,这是意料之中的。当OP启用时,一切都按预期工作。

浏览器/客户端处理安全性,通常将内容限制在单一来源,这意味着它们只接受来自请求服务器的内容。在标头(ACAO)或任何位置启用cors可以让服务器告诉浏览器,"嘿,其他跨来源资源都在我身边。"浏览器通常会同意这一点。