【发布时间】:2014-07-26 20:09:39
【问题描述】:
我已在 ServiceStack 中为所有动词、标准标题加上一些自定义标题和所有来源启用了 CORS 功能。从我的 Angular 应用程序中,我在尝试对服务器进行 PUT 调用时收到 CORS“请求的资源上不存在‘Access-Control-Allow-Origin’标头”错误。如果我查看我的流量,我会看到对资源的 OPTIONS 预检请求返回一个有效的 200 消息,并且 ACAO 标头存在并设置为 *。
// CORS PREFLIGHT REQUEST
OPTIONS /referral HTTP/1.1
Host: api.mydomain.com
Connection: keep-alive
Access-Control-Request-Method: PUT
Origin: http://127.0.0.1:9000
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.114 Safari/537.36
Access-Control-Request-Headers: accept, x-uatoken, x-ualocation, content-type
Accept: */*
Referer: http://127.0.0.1:9000/
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
// CORS RESPONSE
HTTP/1.1 200 OK
Cache-Control: private
Vary: Accept
Server: Microsoft-IIS/8.0
X-Powered-By: ServiceStack/4.020 Win32NT/.NET
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS
Access-Control-Allow-Headers: Content-Type, X-UAToken, X-UAUser, X-UALocation, Authorization
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Thu, 05 Jun 2014 17:27:47 GMT
Content-Length: 0
注意:我正在使用 angular-file-upload 库将此请求作为 multipart/form-data(从 Request.Files 中提取文件并从服务器上的 Request.FormData 中反序列化数据)。在 Chrome 中调试第二个请求(实际的 PUT)会显示有关“显示临时标头”的消息,因此我不确定该数据有多大用处:
Accept:application/json, text/plain, */*
Content-Type:multipart/form-data; boundary=----WebKitFormBoundary3rvpR6k8pz4rghGy
Origin:http://127.0.0.1:9000
Referer:http://127.0.0.1:9000/
User-Agent:Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.114 Safari/537.36
X-UALocation:7
X-UAToken:yoqoByj-T1SBDHCYir92JQ
Request Payload
...etc...
有什么想法吗?
【问题讨论】:
-
除了 Chrome 之外的其他浏览器是否也可以使用?见stackoverflow.com/a/21103081/215502
-
从昨天开始,我一直在尝试自己解决同样的问题。唯一的区别是我使用的是 jQuery File Upload。起初我认为这可能是 localhost chrome CORS 问题。但是我已经在 IIS 和所有浏览器中安装了测试服务器和同样的问题。预检按预期进行,文件上传开始。然后,当它完成发布文件时,Chrome 会响应请求的资源上不存在“Access-Control-Allow-Origin”标头。即使我在 ServiceStack 中使用全局 CorsFeature 插件......所有请求都有那个标题!!!
-
我还注意到另一件事,我可以对同一个端点执行一个简单的 $.ajax POST 并且它会成功。此外,如果我要通过 curl 进行文件上传,它会按预期进行,并且在响应标头中我会看到所有 Access-Control-Allow-* 标头。
标签: servicestack cors