【问题标题】:HttpWebRequest in .NET Core 2.0 throwing 302 Found Exception.NET Core 2.0 中的 HttpWebRequest 抛出 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”标志的设置似乎也不同。

标签: c# asp.net asp.net-core system.net.httpwebrequest asp.net-core-2.0


【解决方案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,它更容易使用 模式。

【讨论】:

    猜你喜欢
    • 2018-10-15
    • 2015-05-30
    • 2019-03-27
    • 2011-03-29
    • 2012-06-12
    • 1970-01-01
    • 2016-04-17
    • 2018-01-20
    • 1970-01-01
    相关资源
    最近更新 更多