代码之家  ›  专栏  ›  技术社区  ›  murzagurskiy

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

  •  5
  • murzagurskiy  · 技术社区  · 8 年前

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

    我想重复这种行为,而不需要任何连接。 那么,我如何创建 new WebException(..., ..., ..., ...) 状态描述

    3 回复  |  直到 8 年前
        1
  •  3
  •   Fan TianYi    8 年前

    您需要自定义类以增加HTTP状态代码:

    public class HttpWebException : WebException
    {
        public int HttpStatusCode { get; set; }        
    }
    
        2
  •  2
  •   Alice    8 年前

    这里最棘手的是 WebException(String, Exception, WebExceptionStatus, WebResponse) 构造函数是免费的 HttpWebResponse HttpWebRequest (有构造函数,但它们已过时)。

    所以,自从 WebException 接受摘要 WebResponse 而不是 HttpWebResponse(HttpWeb响应) ,我建议创建一个类 MockHttpWebResponse 或者别的什么。我不知道你确切需要哪些变量,所以我将把你链接到 HttpWebResponse source 以便您从中提取基本变量。

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

    new WebException(message, null, WebExceptionStatus.ProtocolError, new MockHttpWebResponse(statusCode))
    

    …或类似的东西。我认为您最清楚您的场景需要什么

        3
  •  0
  •   Natalie Polishuk    8 年前

    您可以使用反射来实现这一点。在下面的示例中,我创建了一个web异常,并调整了响应i(也使用反射)。

    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;