.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。
在其中,我们使用HttpWebRequest
与AllowAutoRedirect
设置为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的主要内容,如果未能解决你的问题,请参考以下文章
ApplicationUser在Asp.Net Core 2.0中的ActionFilter中?
.NET Core 2.0 中的 HttpWebRequest 抛出 302 Found Exception
AddEntityFrameworkStores 只能使用派生自 .NET Core 2.0 中的 IdentityRole 的角色调用