考虑以下情况:
- Web 服务器正在运行 .NET 应用程序
<sessionState cookieless="AutoDetect" />
. - 客户端使用简单的
HttpWebRequest
向其 POST 数据(没有cookie)。
这个看似简单的案例导致了重大失败。
由于 .NET 无法确定请求代理 ( HttpWebRequest
) 是否支持 Cookie,因此它会使用 302 Found 重定向到同一位置来响应 POST 请求:
- 名为
AspxAutoDetectCookie
的 cookie在响应中 - 名为
AspxAutoDetectCookie
的查询参数在转发的位置
然后,请求代理应该请求新位置,即 HttpWebRequest
做。当.NET看到AspxAutoDetectCookie
时在查询字符串中,它知道这是一个重新请求,并且可以通过查看是否有名为 AspxAutoDetectCookie
的 cookie 来确定是否支持 cookie。位于请求 header 中。
问题是,大多数请求代理(Web 浏览器, HttpWebRequest
)将 302 Found 视为 303 See Other,并将重新请求设为 GET,无论原始 HTTP 方法如何!不会转发初始 POST 请求中发送的任何数据。
正确的响应应该是 307 临时重定向,它不会更改请求方法。 (对位置 X 的 POST 请求重定向至对位置 Y 的 POST 请求。)
有什么方法可以改变 .NET 中的这种行为,这样 POST 请求就不会被破坏吗?
最佳答案
我能想到的唯一解决方案是将 AspxAutoDetectCookie=1
附加到所有 POST 请求。
这样,ASP.NET 将永远不会重定向请求,我们可以完全避开 302 与 307 问题。如果请求中嵌入了 cookie,ASP.NET 将检测是否支持 cookie,如果没有嵌入 cookie,则假定不支持。
关于.net - 设置 <sessionState cookieless ="AutoDetect"/> 时 POST 请求失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3524067/