gpt4 book ai didi

c# - HttpWebRequest 仅在 Internet Explorer 中为 302 返回 404

转载 作者:太空狗 更新时间:2023-10-29 19:44:36 29 4
gpt4 key购买 nike

我有一个使用 WebRequest 的 Silverlight (v3) 应用程序向与 Silverlight 应用程序位于同一网站上的网页发出 HTTP POST 请求。此 HTTP 请求返回 302(重定向)到同一网站上的另一个页面,HttpWebRequest应该自动跟随 ( according to the documentation )。

发出请求的代码没有什么特别之处(它使用浏览器的 HTTP 堆栈,未配置为使用备用内置 Silverlight HTTP 堆栈):

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(String.Format("{0}?name={1}&size={2}", _UploadUrl, Uri.EscapeUriString(Name), TotalBytes));
request.Method = "POST";

这一切在 Firefox 和 Chrome 中运行良好; Silverlight 发出 POST HTTP 请求,接收 302 响应并自动执行指定重定向 URL 的 GET HTTP 请求并将其返回给我(我知道这一点是因为我使用 Fiddler 观察正在进行的 HTTP 请求)。但是,在 Internet Explorer (v8) 中,Silverlight 执行 POST HTTP 请求,然后抛出带有 404 错误代码的 WebException!

使用 Fiddler,我可以看到 Silverlight/Internet Explorer 已成功返回请求的 302 状态代码,并且我假设我在 Silverlight 中获得的 404 状态代码(和关联的 WebException)是因为据我所知由于限制,通过浏览器堆栈完成的 HTTP 请求只能返回 200 或 404。真正的问题是为什么 Internet Explorer 不像其他浏览器那样遵循重定向

在此先感谢您的帮助!

编辑: 我宁愿不使用 Silverlight 客户端 HTTP 堆栈,因为据我所知,它发出的请求不包括作为浏览器 session 一部分的 cookie,关键包括 ASP.NET我需要附加到 Silverlight 控件发出的 HTTP 请求的身份验证 cookie。

编辑 2: 我发现 Internet Explorer 只有在您执行 POST 请求时才会表现出这种行为。 GET 请求重定向成功。考虑到现在有多少网站以 Post-Redirect-Get 风格做事,这似乎是非常糟糕的行为。

最佳答案

IE 更接近规范,因为在响应 POST 的 302 时,用户代理应该发送 POST(尽管它不应该在没有用户确认的情况下这样做)。

另一方面,FF 和 Chrome 是故意错误的,它们复制了用户代理在相当长一段时间前经常出错的方式(问题在 HTTP 的早期就开始了)。

出于这个原因,在 HTTP/1.1 中引入了 307,以便更清楚地表明应该使用相同的 HTTP 方法(即在这种情况下,它应该是 POST),而 303 始终意味着应该使用 GET。

因此,与其执行导致 302 的 Response.Redirect - 不同的用户代理将以不同的方式处理,不如发送 303。以下代码这样做(并包含有效的实体主体只是为了在规范的字母范围内)。有一个重载,因此您可以使用 Uri 或字符串调用它:

private void SeeOther(Uri uri)
{
if(!uri.IsAbsoluteUri)
uri = new Uri(Request.Url, uri);
Response.StatusCode = 303;
Response.AddHeader("Location", uri.AbsoluteUri);
Response.ContentType = "text/uri-list";
Response.Write(uri.AbsoluteUri);
Context.ApplicationInstance.CompleteRequest();
}
private void SeeOther(string relUri)
{
SeeOther(new Uri(Request.Url, relUri));
}

关于c# - HttpWebRequest 仅在 Internet Explorer 中为 302 返回 404,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4277982/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com