即使OPTIONS预检检出,ServiceStack CORS请求也会失败

时间:2014-06-05 17:51:36

标签: servicestack cors

我已经在ServiceStack中启用了CORS功能,适用于所有动词,标准标题以及一些自定义标题和所有来源。从我的Angular应用程序中,我在尝试对服务器进行PUT调用时,在请求的资源上出现CORS“No'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...

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

我看到预检检查是否正在请求PUT动词?您可能想要检查为PUT / DELETE动词设置IIS(它是一整套蠕虫)。或者只是尝试将请求作为POST来查看是否有效,然后您知道它可能只是IIS中的动词。

答案 1 :(得分:0)

我过去曾处理过这个问题,直到现在我才相信我不认识它。在您处理文件上传(如PHP或Tomcat)的任何运行时环境中都很常见。问题根本不是你的CORS设置(因为预检检查正在通过)。除非它完全不同于我的猜测,否则你会遇到ASP.NET和IIS最大请求限制!默认情况下,这些都非常低(4MiB)。解决起来很简单,只需要在web.config中添加一些东西。只有在IIS7.5 +上我才相信IIS设置。也可能建议根据允许上传运行的时间来更改executionTimeout(这取决于客户端的速度和文件的大小)。

我终于认识到当我最终在调试模式下运行ServiceStack项目并告诉它向我提出所有.NET异常时的问题。试图上传一个足够大的文件(我正在用很小的文件进行测试!doh!),然后这个例外让我很清楚。 System.Web.HttpException“超出最大请求长度。”

以下是您需要做的示例

  <system.web>
    <!-- maxRequestLength size is specified in kiB (int32). this controls max length handled by ASP.NET
         set to 2GiB currently

         executionTimeout is seconds before request is shutdown.
         set to 2 hours currently
         -->
    <httpRuntime targetFramework="4.5" maxRequestLength="2097152" executionTimeout="7200" />
  </system.web>
  <system.webServer>
    <security>
      <requestFiltering>
        <!-- size is specified in bytes (uint32). this controls max length of IIS
             set to 2GiB currently -->
        <requestLimits maxAllowedContentLength="2147483648" />
      </requestFiltering>
    </security>
  </system.webServer>