【发布时间】:2011-04-01 05:52:30
【问题描述】:
考虑以下情况:
- Web 服务器正在运行带有
<sessionState cookieless="AutoDetect" />的 .NET 应用程序。 - 客户端使用简单的
HttpWebRequest(无 cookie)向其发布数据。
这个看似简单的案例却导致重大失败。
由于 .NET 无法确定请求代理 (HttpWebRequest) 是否支持 cookie,它使用 302 Found 重定向到相同位置来响应 POST 请求:
- 响应中名为
AspxAutoDetectCookie的 cookie - 转发位置中名为
AspxAutoDetectCookie的查询参数
然后请求代理应该请求新位置,HttpWebRequest 会这样做。当 .NET 在查询字符串中看到 AspxAutoDetectCookie 时,它就知道这是一个重新请求,它可以通过查看名为 AspxAutoDetectCookie 的 cookie 是否在请求标头中来确定是否支持 cookie。
问题在于大多数请求代理(Web 浏览器,HttpWebRequest)将 302 Found 视为 303 See Other 并将重新请求设为 GET,而不管原始 HTTP 方法如何!初始 POST 请求中发送的任何数据都不会被转发。
正确的响应应该是307 Temporary Redirect,不会改变请求方式。 (对位置 X 的 POST 请求会重定向到对位置 Y 的 POST 请求。)
有什么方法可以改变 .NET 中的这种行为,使 POST 请求不会被破坏?
【问题讨论】:
标签: .net asp.net http-status-code-302 cookieless http-status-code-307