HttpWebRequest.GetResponse throws WebException on

2019-07-04 09:56发布

当Web服务器响应HttpWebRequest.GetResponse()与HTTP 304(未修改) GetResponse() thows一个WebException ,这是所以非常怪我。 这是通过设计还是我缺少明显的东西吗?

Answer 1:

好了,这似乎是一个被设计的行为和一个完美的例子让人头疼的例外 。 这可以用这个来解决:

public static HttpWebResponse GetHttpResponse(this HttpWebRequest request)
{
    try
    {
        return (HttpWebResponse) request.GetResponse();
    }
    catch (WebException ex)
    {
        if(ex.Response == null || ex.Status != WebExceptionStatus.ProtocolError)
            throw; 

        return (HttpWebResponse)ex.Response;
    }
}


Answer 2:

这真是一个令人沮丧的问题,并且可以交替使用下面的扩展方法类和调用request.BetterGetResponse周围的工作()

//-----------------------------------------------------------------------
//
//     Copyright (c) 2011 Garrett Serack. All rights reserved.
//
//
//     The software is licensed under the Apache 2.0 License (the "License")
//     You may not use the software except in compliance with the License.
//
//-----------------------------------------------------------------------

namespace CoApp.Toolkit.Extensions {
    using System;
    using System.Net;

    public static class WebRequestExtensions {
        public static WebResponse BetterEndGetResponse(this WebRequest request, IAsyncResult asyncResult) {
            try {
                return request.EndGetResponse(asyncResult);
            }
            catch (WebException wex) {
                if( wex.Response != null ) {
                    return wex.Response;
                }
                throw;
            }
        }

        public static WebResponse BetterGetResponse(this WebRequest request) {
            try {
                return request.GetResponse();
            }
            catch (WebException wex) {
                if( wex.Response != null ) {
                    return wex.Response;
                }
                throw;
            }
        }
    }
}

您在阅读更多关于它在我的博客文章对这个问题http://fearthecowboy.com/2011/09/02/fixing-webrequests-desire-to-throw-exceptions-instead-of-returning-status/



Answer 3:

为了避免这个问题的方法System.WebException是设置AllowAutoRedirect属性为false 。 这将禁用的自动重定向逻辑WebRequest 。 这似乎被打破了304个重定向请求,因为它不是严格意义上的真正的重定向。 当然,这意味着其他重定向请求3xx必须手动操作。



Answer 4:

正如一个供参考,这是一个更新安东Gogolev的回答是使用C#6(VS2015) when的条款。 它使用调试器时,因为它消除了一个捕获点是有点少恼人:

public static HttpWebResponse GetHttpResponse(this HttpWebRequest request)
{
    try
    {
        return (HttpWebResponse) request.GetResponse();
    }
    catch (WebException ex)
        when (ex.Status == WebExceptionStatus.ProtocolError && ex.Response != null)
    {
        return (HttpWebResponse) ex.Response;
    }
}


Answer 5:

我也碰到这个问题的代码:

try
{
    ...
    var webResponse = req.GetResponse();
    ...
}
catch (WebException ex)
{
    Log.Error("Unknown error occured", ex);
    //throw; 
}

它看来,如果远程服务器返回304种状态,必须通过抛出此错误或返回定制304使浏览器可以返回缓存的响应被传递给浏览器。 否则,你可能会得到来自远程服务器的空响应。

所以在我的情况下,对于正确处理缓存应该像正常的行为:

try
{
    ...
    var webResponse = req.GetResponse();
    ...
}
catch (WebException ex)
{
    if (((HttpWebResponse)ex.Response).StatusCode == HttpStatusCode.NotModified)
        throw;
    Log.Error("Unknown error occured", ex);
}


文章来源: HttpWebRequest.GetResponse throws WebException on HTTP 304