Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#如何使用响应状态代码创建WebException_C#_Exception_Http Status Codes_Webexception - Fatal编程技术网

C#如何使用响应状态代码创建WebException

C#如何使用响应状态代码创建WebException,c#,exception,http-status-codes,webexception,C#,Exception,Http Status Codes,Webexception,我制作了一些假类,应该和原来的类有相同的行为。 原始类有时抛出WebException(服务器响应为StatusCode) 我想在没有任何联系的情况下重复这种行为。 那么,如何使用所需的状态码创建新的WebException(…,…,…,…)您需要自定义一个类来增加HTTP状态码: public class HttpWebException : WebException { public int HttpStatusCode { get; set; } } 这里棘手的部

我制作了一些假类,应该和原来的类有相同的行为。 原始类有时抛出WebException(服务器响应为
StatusCode

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

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

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

这里棘手的部分是,虽然构造函数是免费提供的,但是
HttpWebResponse
被声明为仅通过
HttpWebRequest
创建(有构造函数,但它们已经过时)

因此,既然
WebException
接受抽象
WebResponse
而不是
HttpWebResponse
,我建议创建一个类
MockHttpWebResponse
或其他什么。我不知道您确切需要哪些变量,因此我将把您链接到,以便您从中清除基本变量

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

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;