2016-07-21 14 views
2

私はいくつかの偽のクラスを作成します。 元のクラスでWebExceptionsがスローされることがあります(サーバからの応答でStatusCode)。C#レスポンスステータスコード付きのWebExceptionを作成する方法

私は接続せずにこの動作を繰り返す必要があります。 だから、どのように私はあなたがHTTPステータスコードを高めるために、クラスをカスタマイズする必要がStatusCode

答えて

1

ここでトリッキーな部分があることWebException(String, Exception, WebExceptionStatus, WebResponse)コンストラクタは、HttpWebResponse自由に利用可能である一方、 HttpWebRequestによってのみ作成されると述べられています(コンストラクタがありますが、廃止されています)。だから、

WebExceptionは抽象WebResponseではなくHttpWebResponseを受け付けているので、私はクラスMockHttpWebResponseか何かを作る示唆しています。どの変数が正確に必要なのかわかりませんので、代わりに重要変数を取り除くためにHttpWebResponse sourceにリンクします。

その後、あなたはここのようにコンストラクタでこのクラスを使用します。

new WebException(message, null, WebExceptionStatus.ProtocolError, new MockHttpWebResponse(statusCode)) 

...または類似した何か。私はあなたのシナリオに必要なものが何であるかを知っていると思います。 ;)

1

必要とnew WebException(..., ..., ..., ...)を作成することができます。

public class HttpWebException : WebException 
{ 
    public int HttpStatusCode { get; set; }   
} 
0

これを達成するために反射を使用することができます。次の例では、レスポンスiが調整されたWeb例外を作成しました(リフレクションも使用しています)。

HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
statusCode = (int)response.StatusCode; 
ActivateCallback(responseCallback, response, url, string.Empty); 

var fieldStatusCode = response.GetType().GetField("m_StatusCode", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance); 
{ 
    var statusCodeNew = (HttpStatusCode)403; 
    fieldStatusCode.SetValue(response, statusCodeNew); 
} 


string responceBody = "{\"error\":{\"code\":\"AF429\",\"message\":\"Too many requests. Method=GetContents, PublisherId=00000000-0000-0000-0000-000000000000\"}}"; 

var propStream = response.GetType().GetField("m_ConnectStream", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance); 

    System.IO.MemoryStream ms = new System.IO.MemoryStream(System.Text.Encoding.UTF8.GetBytes(responceBody)); 
    //response.ResponseStream = ms;//((System.Net.ConnectStream)(response.ResponseStream)) 
    propStream.SetValue(response, ms); 
    ms.Position = 0; 


WebException ex1 = new WebException(); 
var fieldResponce = ex1.GetType().GetField("m_Response", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance); 
{ 
    fieldResponce.SetValue(ex1, response); 
} 
e = null; 
throw ex1; 
関連する問題