Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# HttpWebRequest仅在Internet Explorer中返回404s,持续302s_C#_.net_Silverlight_Internet Explorer_Httpwebrequest - Fatal编程技术网

C# HttpWebRequest仅在Internet Explorer中返回404s,持续302s

C# HttpWebRequest仅在Internet Explorer中返回404s,持续302s,c#,.net,silverlight,internet-explorer,httpwebrequest,C#,.net,Silverlight,Internet Explorer,Httpwebrequest,我有一个Silverlight(v3)应用程序,用于向Silverlight应用程序所在网站上的网页发出HTTP POST请求。此HTTP请求将返回302(重定向)到同一网站上的另一个页面,该页面应自动跟随() 发出请求的代码没有什么特别之处(它使用浏览器的HTTP堆栈,未配置为使用备用内置Silverlight HTTP堆栈): 所有这些在Firefox和Chrome中都可以正常工作;Silverlight发出POST HTTP请求,接收302响应,并自动执行指定重定向URL的GET HTTP

我有一个Silverlight(v3)应用程序,用于向Silverlight应用程序所在网站上的网页发出HTTP POST请求。此HTTP请求将返回302(重定向)到同一网站上的另一个页面,该页面应自动跟随()

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

所有这些在Firefox和Chrome中都可以正常工作;Silverlight发出POST HTTP请求,接收302响应,并自动执行指定重定向URL的GET HTTP请求并将其返回给我(我知道这一点,因为我使用Fiddler监视HTTP请求的进行)。 然而,在InternetExplorer(v8)中,Silverlight执行POSThttp请求,然后抛出一个带有404错误代码的WebException

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

提前感谢您的帮助

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


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

我认为这是Internet Explorer 7的一项功能更改,他们将预期的200响应更改为302,告知IE重定向。我所知道的这个问题没有顺利的解决办法。不久前也提出了类似的问题


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

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

因此,HTTP/1.1中引入307是为了更清楚地说明应该使用相同的HTTP方法(即,在本例中,它应该是POST),而303始终意味着应该使用GET

因此,与其执行
Response.Redirect
,从而生成302-不同的用户代理将以不同的方式处理,不如发送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));
}

重定向的url还指向发布到的同一服务器中的资源,Xap来自该服务器?据我所知,Chrome和Firefox可能会以不同的方式处理凭据。有关于证件的事吗?请求的URL是否接受匿名或经过身份验证的请求?您是否检查了服务器访问日志中的HTTP代码?是否可以使用客户端HTTP处理工具?这样您就可以访问所有状态代码。见@AnthonyWJones:是的。我已经在问题中编辑并澄清了这一点@JoeBilly:最初请求的URL和重定向到的URL都需要ASP.NET表单身份验证。使用Fiddler和ASP.NET网站附带的调试器,我可以看到身份验证工作正常;IE(和其他浏览器)在请求中包含表单auth cookie,服务器接受它@Feroze:我想避免使用客户端HTTP堆栈,因为我已经编辑了上面的问题。HTTP头是一样的吗?特别是缓存头?关于404错误,它可能隐藏了真实的响应:尝试从WebException.response获取真实的响应。我认为我的问题与此无关。你链接的博客文章明确指出,这种行为是针对连接请求(即HTTPS)的,而我没有这样做;我的请求都是通过正常的HTTP完成的。谢谢你的回答;我尝试将重定向更改为303(以及上面示例代码中的其他内容),但是Internet Explorer仍然会将404返回到我的Silverlight控件的请求中,不管怎样:((对迟来的答复表示歉意)
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));
}