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

本文关键字:响应 状态 代码 WebException 何创建 创建 | 更新日期: 2023-09-27 17:58:04

我制作了一些伪类,它应该和原始类具有相同的行为。原始类有时会抛出WebExceptions(服务器响应StatusCode)。

我想在没有任何联系的情况下重复这种行为。那么,我如何使用所需的StatusCode 创建new WebException(..., ..., ..., ...)

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

您需要自定义一个类来增加HTTP状态代码:

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

这里的棘手之处在于,虽然WebException(String、Exception、WebExceptionStatus、WebResponse)构造函数是免费可用的,但HttpWebResponse声明只能通过HttpWebRequest创建(有构造函数,但它们已经过时)。

因此,由于WebException接受抽象的WebResponse而不是HttpWebResponse,我建议创建一个类MockHttpWebResponse之类的。我不知道你到底需要哪些变量,所以我将把你链接到HttpWebResponse源,让你从中提取基本变量。

然后在构造函数中使用这个类,如下所示:

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;