30

WebサーバーがHTTP304 HttpWebRequest.GetResponse()(変更なし)で応答するとき、これは私にとって非常に奇妙なことです。これは設計によるものですか、それともここで明らかな何かが欠けていますか?GetResponse()WebException

4

5 に答える 5

48

OK、これは設計上の動作であり、厄介な例外の完璧な例のようです。これはこれで解決できます:

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;
    }
}
于 2009-09-02T10:17:04.363 に答える
7

これは本当に厄介な問題であり、代わりに、次の拡張メソッド クラスを使用して 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/をご覧ください。

于 2011-09-03T00:41:54.577 に答える