.NET Core 2.0 中的 HttpWebRequest 抛出 302 Found Exception

Posted

技术标签:

【中文标题】.NET Core 2.0 中的 HttpWebRequest 抛出 302 Found Exception【英文标题】:HttpWebRequest in .NET Core 2.0 throwing 302 Found Exception 【发布时间】:2018-01-18 03:05:26 【问题描述】:

我们正在将我们的应用程序从 .net 框架升级到 .net core 2.0。

在其中,我们使用HttpWebRequestAllowAutoRedirect 设置为false 的站点联系。当代码执行request.GetResponse()时,该站点将返回一个302响应,在.net框架中是可以的-您可以获取响应并处理它(我们在set-cookie标头值之后)。

但是,在 .net core 2.0 中,会引发 WebException:

The remote server returned an error: (302) Found.

我的理解是否不正确,因为 302 应该导致抛出异常,而不是如果 AllowAutoRedirect 设置为 false 则仍应返回响应?有什么方法可以触发 .net 框架中的相同行为?

【问题讨论】:

对于其他也来到这里的人,我在 .NET Framework 和 .NET Core 的 cookie 行为方面遇到了一些差异,“HttpOnly”标志的设置似乎也不同。 【参考方案1】:

AllowAutoRedirect 设置为false 时出现同样的错误。 我通过将try-catch-block 包裹在request.GetResponse() 周围并将异常结果分配给变量来解决了这个问题

WebResponse response;
try 
   response = request.GetResponse();

catch(WebException e)) 
   if(e.Message.Contains("302")
      response = e.Result;

【讨论】:

应该是e..Response 我建议稍微修改一下 catch 块;捕捉(WebException ex)响应=(HttpWebResponse)ex.Response; if(response.StatusCode != HttpStatusCode.Redirect) throw (ex); 使事情更加简洁,而不是依赖于一致的字符串消息。【参考方案2】:

看看这个问题 - HttpWebRequest in .NET Core 2.0 throwing 301 Moved Permanently。简而言之,它说:

如果你设置了AllowAutoRedirect,那么你最终不会关注 重定向。这意味着以 301 响应结束。

HttpWebRequest(不像HttpClient)抛出异常 不成功(非 200)状态码。所以,得到一个例外(大多数 可能是WebException)。

因此,如果您需要处理该重定向(即 HTTPS -> HTTP 由 方式),您需要将其捕获在 try/catch 块中并检查 WebException 等。这是HttpWebRequest 的标准用法。

这就是为什么我们建议开发者使用HttpClient,它更容易使用 模式。

【讨论】:

以上是关于.NET Core 2.0 中的 HttpWebRequest 抛出 302 Found Exception的主要内容,如果未能解决你的问题,请参考以下文章