C#如何创建带有响应状态码的WebException

5

我创建了一些虚假的类,应该具有与原始类相同的行为。 原始类有时会抛出 WebExceptions(带有来自服务器的 StatusCode 的响应)。

我想在没有任何连接的情况下重复这种行为。 那么,我如何创建一个带有所需 StatusCodenew WebException(..., ..., ..., ...)

3个回答

3

您需要自定义一个类来提高HTTP状态码:

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

2
这里比较棘手的是,虽然WebException(String, Exception, WebExceptionStatus, WebResponse)构造函数是免费提供的,但HttpWebResponse仅通过HttpWebRequest创建(有构造函数,但已过时)。
因此,由于WebException接受抽象的WebResponse而不是HttpWebResponse,建议创建一个名为MockHttpWebResponse的类。我不知道你需要哪些变量,所以我会链接到HttpWebResponse源代码,让你从中获取必要的变量。
然后在构造函数中使用这个类,就像这样:
new WebException(message, null, WebExceptionStatus.ProtocolError, new MockHttpWebResponse(statusCode))

......或类似的东西。我认为您最了解您场景所需的内容。


0
你可以使用反射来实现这个功能。在下面的例子中,我创建了一个带有调整响应的 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;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接