考虑以下情况:
- Web 服务器正在运行 .NET 应用程序
<sessionState cookieless="AutoDetect" />
.
- 客户端使用简单的方法向其 POST 数据
HttpWebRequest
(没有cookies)。
这个看似简单的案例却导致了重大失败。
由于 .NET 无法确定请求代理(HttpWebRequest
)支持 cookie,它使用 302 Found 重定向到相同位置来响应 POST 请求:
- 一个名为
AspxAutoDetectCookie
在回应中
- 名为的查询参数
AspxAutoDetectCookie
在转发的位置
然后,请求代理应该请求新位置,该位置HttpWebRequest
做。当.NET看到AspxAutoDetectCookie
在查询字符串中,它知道这是一个重新请求,并且可以通过查看是否有名为 cookie 来确定是否支持 cookieAspxAutoDetectCookie
位于请求标头中。
问题是大多数请求代理(网络浏览器、HttpWebRequest
) 将 302 Found 视为 303 See Other 并将重新请求设为 GET,无论原始 HTTP 方法如何!不会转发初始 POST 请求中发送的任何数据。
正确的响应应该是 307 临时重定向,它不会更改请求方法。 (对位置 X 的 POST 请求重定向到POST向位置 Y 发出请求。)
有没有办法改变 .NET 中的这种行为,以便 POST 请求不会被破坏?
有关 3xx 重定向的信息 http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#3xx_Redirection
我能看到的唯一解决方案是附加AspxAutoDetectCookie=1
所有 POST 请求。
这样,ASP.NET 将永远不会重定向请求,我们可以完全避开 302 与 307 问题。如果请求中嵌入了 cookie,ASP.NET 将检测是否支持 cookie,如果没有嵌入 cookie,则假定不支持。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)