servicestack 即使选项飞行前签出,ServiceStack CORS请求仍失败,servicestack,cors,servicestack,Cors" /> servicestack 即使选项飞行前签出,ServiceStack CORS请求仍失败,servicestack,cors,servicestack,Cors" />

servicestack 即使选项飞行前签出,ServiceStack CORS请求仍失败

servicestack 即使选项飞行前签出,ServiceStack CORS请求仍失败,servicestack,cors,servicestack,Cors,我在ServiceStack中为所有动词、标准标题加上一些自定义标题以及所有来源启用了CORS功能。从我的Angular应用程序中,我在尝试对服务器进行PUT调用时收到CORS“请求的资源上不存在‘访问控制允许源’头”错误。如果我查看我的流量,我会看到对资源的选项飞行前请求返回一条有效的200消息,并且ACAO标头存在并设置为* // CORS PREFLIGHT REQUEST OPTIONS /referral HTTP/1.1 Host: api.mydomain.com Connecti

我在ServiceStack中为所有动词、标准标题加上一些自定义标题以及所有来源启用了CORS功能。从我的Angular应用程序中,我在尝试对服务器进行PUT调用时收到CORS“请求的资源上不存在‘访问控制允许源’头”错误。如果我查看我的流量,我会看到对资源的选项飞行前请求返回一条有效的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 library将此请求作为多部分/表单数据(从服务器上的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...

有什么想法吗?

我以前处理过这个问题,我不敢相信我直到现在才意识到这一点。这在PHP或Tomcat等文件上传的任何运行时环境中都很常见。问题根本不是您的CORS设置(因为飞行前检查通过了)。除非它完全是另外一回事,我猜你遇到了ASP.NET和IIS最大请求限制!默认情况下,这两个值都非常低(4MiB)。解决起来非常简单,只需在web.config中添加一些内容。IIS设置只有在您使用IIS7.5+时才是必需的。还建议更改executionTimeout,具体取决于允许上载运行的时间(取决于客户端速度和文件大小)

当我最终以调试模式运行ServiceStack项目并告诉它向我引发所有.NET异常时,我终于意识到了问题所在。试图上传一个足够大的文件(我在curl中测试的是非常小的文件!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>


我看到飞行前检查请求PUT动词?您可能需要检查为PUT/DELETE动词设置IIS(这是另一个完全不同的蠕虫)。或者将请求作为帖子来尝试,看看是否有效,那么您就知道它可能只是IIS中的动词。

除了Chrome之外,它在其他浏览器中也有效吗?从昨天开始我就一直在努力解决同样的问题。唯一的区别是我使用的是jQuery文件上传。起初我认为这可能是本地主机chrome CORS的问题。但我在IIS中安装了测试服务器,所有浏览器都有相同的问题。飞行前按预期进行,文件上传开始。然后,当文件发布完成时,Chrome响应,请求的资源上不存在“Access Control Allow Origin”标题。即使我在ServiceStack中使用全局CorsFeature插件。。。所有请求都有那个标题!!!我还注意到的另一件事是,我可以向同一个端点发送一个简单的$.ajax帖子,它会成功的。另外,如果我要通过curl进行文件上传,它会按照预期进行,在响应标题中,我看到了所有的Access Control Allow-*标题。关于文件大小的有趣点,我已经对web.config进行了调整,以防万一,但这不是我的问题。事实上,即使没有提交任何文件,我也会遇到奇怪的CORS问题,我只是以多部分的形式发送JSON。该死,我为您节省了时间,希望以后能解决文件大小问题:)。我看到飞行前检查要求一个PUT动词?您可能还想检查一下为PUT/DELETE动词设置IIS(这完全是另一种蠕虫)。我会像发帖一样尝试一下这个请求,看看它是否有效,然后你知道它可能只是IIS中的动词。这是个好主意,因为PUT是“复杂的”,POST是“简单的”。不知道为什么。我希望在“放置”=创建新项目和“发布”=更新现有项目的地方保持整洁,但我可能会尝试所有的发布,看看这是否有帮助。如果有,我会在这里更新。谢谢请添加您的建议,将PUT动词切换为POST作为答案,我将全部接受。白天长的我做了改变,现在一切都非常好。真不敢相信。这些CORS错误使开发人员验证和故障排除成为PITA,但仅此而已!谢谢你的建议。