.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的主要内容,如果未能解决你的问题,请参考以下文章

.NET Core 2.0 中的位图图像

ASP.NET CORE 2.0 中的 FromUri

ASP.NET Core 2.0 中的多个身份

ApplicationUser在Asp.Net Core 2.0中的ActionFilter中?

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

AddEntityFrameworkStores 只能使用派生自 .NET Core 2.0 中的 IdentityRole 的角色调用