C# 如何使用响应状态代码创建 WebException
C# how create WebException with Response status code
我做了一些假的 class,应该与原始的行为相同。
原始 class 有时会抛出 WebExceptions(服务器响应 StatusCode
)。
我想在没有任何联系的情况下重复此行为。
那么,我如何创建 new WebException(..., ..., ..., ...)
所需的 StatusCode
您需要自定义一个class增加HTTP状态码:
public class HttpWebException : WebException
{
public int HttpStatusCode { get; set; }
}
这里棘手的部分是,虽然 WebException(String, Exception, WebExceptionStatus, WebResponse) 构造函数是免费提供的,但据说 HttpWebResponse
只能通过 HttpWebRequest
创建(有构造函数,但它们已过时) .
因此,由于 WebException
接受抽象 WebResponse
而不是 HttpWebResponse
,我建议创建一个 class MockHttpWebResponse
之类的。我不知道你到底需要哪些变量,所以我会 link 你到 HttpWebResponse source 以便你从中清除基本变量。
然后你在构造函数中使用这个 class 就像这里:
new WebException(message, null, WebExceptionStatus.ProtocolError, new MockHttpWebResponse(statusCode))
...或类似的东西。我认为您最了解您的场景需要什么。 ;)
您可以使用反射来实现。在下面的示例中,我创建了一个 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;
我做了一些假的 class,应该与原始的行为相同。
原始 class 有时会抛出 WebExceptions(服务器响应 StatusCode
)。
我想在没有任何联系的情况下重复此行为。
那么,我如何创建 new WebException(..., ..., ..., ...)
所需的 StatusCode
您需要自定义一个class增加HTTP状态码:
public class HttpWebException : WebException
{
public int HttpStatusCode { get; set; }
}
这里棘手的部分是,虽然 WebException(String, Exception, WebExceptionStatus, WebResponse) 构造函数是免费提供的,但据说 HttpWebResponse
只能通过 HttpWebRequest
创建(有构造函数,但它们已过时) .
因此,由于 WebException
接受抽象 WebResponse
而不是 HttpWebResponse
,我建议创建一个 class MockHttpWebResponse
之类的。我不知道你到底需要哪些变量,所以我会 link 你到 HttpWebResponse source 以便你从中清除基本变量。
然后你在构造函数中使用这个 class 就像这里:
new WebException(message, null, WebExceptionStatus.ProtocolError, new MockHttpWebResponse(statusCode))
...或类似的东西。我认为您最了解您的场景需要什么。 ;)
您可以使用反射来实现。在下面的示例中,我创建了一个 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;