2016-07-21 27 views
2

Ich mache einige falsche Klasse, die das gleiche Verhalten wie die ursprüngliche haben sollte. Ursprüngliche Klasse wirft manchmal WebExceptions (mit StatusCode als Antwort vom Server).C# wie WebException mit Antwort Statuscode erstellen

Ich möchte dieses Verhalten ohne Verbindung wiederholen. So , wie kann ich schaffen new WebException(..., ..., ..., ...) mit benötigt StatusCode

Antwort

1

Der schwierige Teil hier ist, dass während WebException(String, Exception, WebExceptionStatus, WebResponse) Konstruktor ist frei verfügbar, die HttpWebResponse wird angegeben, nur durch HttpWebRequest erstellt werden (es gibt Konstruktoren, aber sie sind veraltet).

So, da WebException akzeptiert abstrakte WebResponse anstatt HttpWebResponse, empfehle ich, eine Klasse MockHttpWebResponse oder etwas zu erstellen. Ich weiß nicht, welche Variablen du genau benötigst, also verbinde ich dich stattdessen mit HttpWebResponse source, damit du essentielle Variablen ausspionieren kannst.

Dann nutzen Sie diese Klasse in Konstruktor wie hier:

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

... oder etwas ähnliches. Ich denke, Sie wissen am besten, was für Ihr Szenario benötigt wird. ;)

1

Sie müssen eine Klasse anpassen, um den HTTP-Statuscode zu erhöhen:

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

Sie können dazu Reflexionen verwenden. Im folgenden Beispiel habe ich eine Web-Ausnahme erstellt, bei der die Antwort angepasst wurde (auch mit Reflektionen).

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;