私はいくつかの偽のクラスを作成します。 元のクラスでWebExceptionsがスローされることがあります(サーバからの応答でStatusCode
)。C#レスポンスステータスコード付きのWebExceptionを作成する方法
私は接続せずにこの動作を繰り返す必要があります。 だから、どのように私はあなたがHTTPステータスコードを高めるために、クラスをカスタマイズする必要がStatusCode
私はいくつかの偽のクラスを作成します。 元のクラスでWebExceptionsがスローされることがあります(サーバからの応答でStatusCode
)。C#レスポンスステータスコード付きのWebExceptionを作成する方法
私は接続せずにこの動作を繰り返す必要があります。 だから、どのように私はあなたがHTTPステータスコードを高めるために、クラスをカスタマイズする必要がStatusCode
ここでトリッキーな部分があることWebException(String, Exception, WebExceptionStatus, WebResponse)コンストラクタは、HttpWebResponse
自由に利用可能である一方、 HttpWebRequest
によってのみ作成されると述べられています(コンストラクタがありますが、廃止されています)。だから、
WebException
は抽象WebResponse
ではなくHttpWebResponse
を受け付けているので、私はクラスMockHttpWebResponse
か何かを作る示唆しています。どの変数が正確に必要なのかわかりませんので、代わりに重要変数を取り除くためにHttpWebResponse sourceにリンクします。
その後、あなたはここのようにコンストラクタでこのクラスを使用します。
new WebException(message, null, WebExceptionStatus.ProtocolError, new MockHttpWebResponse(statusCode))
...または類似した何か。私はあなたのシナリオに必要なものが何であるかを知っていると思います。 ;)
必要とnew WebException(..., ..., ..., ...)
を作成することができます。
public class HttpWebException : WebException
{
public int HttpStatusCode { get; set; }
}
これを達成するために反射を使用することができます。次の例では、レスポンス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;