【问题标题】:Preflight Options check options in Azure?Azure 中的预检选项检查选项?
【发布时间】:2015-03-22 00:23:12
【问题描述】:

我正在构建一个简单的 ServiceStack 应用程序并打算将它托管在 AzureWebSites 上。这工作正常。我需要 CORS 才能使应用程序正常工作。在本地的 IIS Express 和 IIS 7.5 中,这可以正常工作 - 但在 Azure 或 AppHarbor 上不行。

实际的 AJAX GET 和 POST 请求工作正常,问题是飞行前的 OPTIONS 检查返回一个空响应;没有标题,什么都没有。

代码位于GitHub。你可以在 git commit history 中看到我尝试过的一些事情。

我已经启用了失败的请求记录——但这并没有帮助。我没有收到 400+ 系列错误代码 - 我根本没有收到任何响应。

编辑:感谢@paaschpa,我开始从不同的机器上查看问题。添加了来自 Linux 机器的另一个响应。它表明 cURL 正在恢复一些奇怪的东西(见下文),导致它根据这个 SO 问题输出调试: Why is cURL returning "additional stuff not fine"?

当我在我的 Rackspace Linux 机器上测试 Azure 时,我得到了这个:

kyleh@media:~$ curl -X curl -X OPTIONS -H "Origin: http://www.example.com" -H "Access-Control-Request-Method: POST" -H "Access-Control-Request-Headers: X-Requested-With" --verbose http://sstodo.azurewebsites.net/items
* About to connect() to sstodo.azurewebsites.net port 80 (#0)
*   Trying 23.101.118.145...
* connected
* Connected to sstodo.azurewebsites.net (23.101.118.145) port 80 (#0)
> OPTIONS /items HTTP/1.1
> User-Agent: curl/7.21.0 (x86_64-pc-linux-gnu) libcurl/7.26.0 OpenSSL/1.0.1e zlib/1.2.3.4 libidn/1.25 libssh2/1.4.2 librtmp/2.3
> Host: sstodo.azurewebsites.net
> Accept: */*
> Origin: http://www.example.com
> Access-Control-Request-Method: POST
> Access-Control-Request-Headers: X-Requested-With
> 
* additional stuff not fine transfer.c:1037: 0 0
* additional stuff not fine transfer.c:1037: 0 0
* additional stuff not fine transfer.c:1037: 0 0
* HTTP 1.1 or later with persistent connection, pipelining supported
< HTTP/1.1 200 OK
< Cache-Control: private
< Content-Length: 0
< Vary: Accept
< Server: Microsoft-IIS/8.0
< X-Powered-By: ServiceStack/4.036 Win32NT/.NET
< Access-Control-Allow-Origin: *
< Access-Control-Allow-Methods: GET, POST, PUT, DELETE, PATCH, OPTIONS
< Access-Control-Allow-Headers: Content-Type
< X-AspNet-Version: 4.0.30319
< X-Powered-By: ASP.NET
< Set-Cookie: ARRAffinity=f1d67e2939c9eab291aa7a92c2c5cffe872dc89340409c771374fbf6bc961bd3;Path=/;Domain=sstodo.azurewebsites.net
< Date: Sun, 01 Feb 2015 02:57:55 GMT
< 
* Connection #0 to host sstodo.azurewebsites.net left intact
* Closing connection #0

当我在本地测试站点时,结果为looks right。这是本地结果(VS / IIS Express):

curl -X OPTIONS 
 -H "Origin: http://www.example.com" 
 -H "Access-Control-Request-Method: POST" 
 -H "Access-Control-Request-Headers: X-Requested-With"
 --verbose http://localhost:1061/items
* timeout on name lookup is not supported
* About to connect() to localhost port 1061 (#0)
*   Trying 127.0.0.1...
* connected
* Connected to localhost (127.0.0.1) port 1061 (#0)
> OPTIONS /items HTTP/1.1
> User-Agent: curl/7.26.0
> Host: localhost:1061
> Accept: */*
> Origin: http://www.example.com
> Access-Control-Request-Method: POST
> Access-Control-Request-Headers: X-Requested-With
>
< HTTP/1.1 200 OK
< Cache-Control: private
< Vary: Accept
< Server: Microsoft-IIS/8.0
< X-Powered-By: ServiceStack/4.036 Win32NT/.NET
< Access-Control-Allow-Origin: *
< Access-Control-Allow-Methods: GET, POST, PUT, DELETE, PATCH, OPTIONS
< Access-Control-Allow-Headers: Content-Type
< X-AspNet-Version: 4.0.30319
< X-SourceFiles: =?UTF-8?B?QzpccHJvamVjdHNcc2VydmljZXN0YWNrLXRvZG8tYmFja2VuZFxUb0RvQmFja2VuZFxUb0RvQmFja2VuZFxpdGVtcw==?=
< X-Powered-By: ASP.NET
< Date: Thu, 22 Jan 2015 23:51:29 GMT
< Content-Length: 0
<
* Connection #0 to host localhost left intact
* Closing connection #0

这是本地 IIS7.5 中的结果:

curl -H "Origin: http://www.example.com" -H "Access-Control-Request-Method: P
OST" -H "Access-Control-Request-Headers: X-Requested-With" -X OPTIONS --verbose
 http://localhost/sstodo/items
* timeout on name lookup is not supported
* About to connect() to localhost port 80 (#0)
*   Trying 127.0.0.1...
* connected
* Connected to localhost (127.0.0.1) port 80 (#0)
> OPTIONS /sstodo/items HTTP/1.1
> User-Agent: curl/7.26.0
> Host: localhost
> Accept: */*
> Origin: http://www.example.com
> Access-Control-Request-Method: POST
> Access-Control-Request-Headers: X-Requested-With
>
< HTTP/1.1 200 OK
< Cache-Control: private
< Vary: Accept
< Server: Microsoft-IIS/7.5
< X-Powered-By: ServiceStack/4.036 Win32NT/.NET
< Access-Control-Allow-Origin: *
< Access-Control-Allow-Methods: GET, POST, PUT, DELETE, PATCH, OPTIONS
< Access-Control-Allow-Headers: Content-Type
< X-AspNet-Version: 4.0.30319
< X-Powered-By: ASP.NET
< Date: Sat, 24 Jan 2015 02:44:55 GMT
< Content-Length: 0
<
* Connection #0 to host localhost left intact
* Closing connection #0

当我对 AzureWebSites(和 AppHarbor)运行测试时,它没有。

curl -X OPTIONS 
 -H "Origin: http://www.example.com" 
 -H "Access-Control-Request-Method: POST" 
 -H "Access-Control-Request-Headers: X-Requested-With" 
 --verbose http://sstodo.azurewebsites.net/items
* timeout on name lookup is not supported
* About to connect() to sstodo.azurewebsites.net port 80 (#0)
*   Trying 23.101.118.145...
* connected
* Connected to sstodo.azurewebsites.net (23.101.118.145) port 80 (#0)
> OPTIONS /items HTTP/1.1
> User-Agent: curl/7.26.0
> Host: sstodo.azurewebsites.net
> Accept: */*
> Origin: http://www.example.com
> Access-Control-Request-Method: POST
> Access-Control-Request-Headers: X-Requested-With
>
* Empty reply from server
* Connection #0 to host sstodo.azurewebsites.net left intact
curl: (52) Empty reply from server
* Closing connection #0

这里是 AppHarbor:

curl -X OPTIONS 
 -H "Origin: http://www.example.com" 
 -H "Access-Control-Request-Method: POST" 
 -H "Access-Control-Request-Headers: X-Requested-With" 
 --verbose http://sstodo.apphb.com/items
* timeout on name lookup is not supported
* About to connect() to sstodo.apphb.com port 80 (#0)
*   Trying 50.17.211.206...
* connected
* Connected to sstodo.apphb.com (50.17.211.206) port 80 (#0)
> OPTIONS /items HTTP/1.1
> User-Agent: curl/7.26.0
> Host: sstodo.apphb.com
> Accept: */*
> Origin: http://www.example.com
> Access-Control-Request-Method: POST
> Access-Control-Request-Headers: X-Requested-With
>
* Empty reply from server
* Connection #0 to host sstodo.apphb.com left intact
curl: (52) Empty reply from server
* Closing connection #0

我有点迷失方向。在我的心智模型中,我应该能够在我的本地环境中重现该问题。我看到的有关 Azure 和 AppHarbor 的所有文档都表明它们没有阻止 OPTIONS 调用,但情况似乎并非如此。

当然,我不太关心网站在 cURL 中的工作方式。

【问题讨论】:

  • 你试过这个 - stackoverflow.com/questions/18981339/… 吗?你为什么不使用 Azure MobileService ,因为这是你正在开发的服务堆栈,我的意思是你作为网站托管?
  • 我已经尝试过这个答案。它真的适用于有 405 错误的 PHP 站点,而不是 m 条件。但是,它链接到有关跟踪日志记录的注释,这可能会有所帮助。我会探索的。
  • OPTIONS 预检请求总是导致 405 错误,认为这会有所帮助,或者至少尝试添加 system.webServer-httpProtocol-customHeaders"Access-Control-Allow-Origin" 和最近回答问题中提到的其他标题(我之前给出的链接) .
  • ServiceStack 为我添加了这些标头,我也尝试按照答案中的建议添加它们。
  • 如果您准备好迁移到 Azure 移动服务,我绝对可以帮助您。最后一个选项 - 尝试在 AppHost.cs 中添加 allowedHeaders 值 = X-Requested-With

标签: asp.net azure servicestack cors appharbor


【解决方案1】:

嗯...不确定这是否有帮助,但我为您准备了一个“我的机器上的作品”。截图如下...

如果您解决了自己的问题,我很想看到解决方法。

【讨论】:

  • 嗯.. 如果是本地的,我会不会觉得很傻。以为我已经检查了代理设置,但值得再看看。谢谢!
  • 也许更新 curl?看起来我运行的是 7.40.0 而你运行的是 7.26.0。所有其他输入看起来几乎相同。此外,这个更简单的请求 -> curl -X OPTIONS --verbose http://sstodo.azurewebsites.net/items
  • 我注意到我的连接到 127.0.0.1。我在任何地方都没有 hosts 文件,但我想知道环境中是否有东西告诉 cURL 使用(不再存在)http 代理
  • 我注意到我的连接到 127.0.0.1 - 只有当您向 localhost:1061/items 发出请求时才会发生这种情况,对吗?当您向sstodo.azurewebsites.net/items 发出请求时,不应该有任何理由(我知道)您的请求通过 127.0.0.1
  • 同意。虽然我升级到相同的版本,但我得到了相同的行为
【解决方案2】:

最后,成功的方法是切换到 HTTPS。

我不能说我明白为什么,但使用 HTTPS 总能解决问题。

【讨论】:

    【解决方案3】:

    我打赌你遇到了和我一样的问题;在您的 OS X 笔记本电脑上运行的 Cisco VPN 客户端中的“网络安全”模块正在拦截您的 HTTP 请求,并默默地丢弃作为 CORS 预检的一部分发出的 OPTIONS 请求。这个 VPN 软件是多么棒的“功能”啊。它甚至在您不使用 VPN 时也会这样做。

    切换到 https 可以解决此问题,因为代理无法读取您的请求,因此无法删除 OPTIONS。

    在此处了解有关此问题的更多信息:http://www.bennadel.com/blog/2559-cisco-anyconnect-vpn-client-may-block-cors-ajax-options-requests.htm

    您可以通过以下方式卸载网络安全模块: sudo /opt/cisco/anyconnect/bin/websecurity_uninstall.sh

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-14
      • 2013-04-12
      • 2015-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-21
      • 1970-01-01
      相关资源
      最近更新 更多