2016-07-21 2 views
2

Je crée une classe fausse, qui devrait avoir le même comportement que l'original. La classe d'origine lance parfois WebExceptions (avec StatusCode en réponse du serveur).C# comment créer WebException avec le code d'état de réponse

Je veux répéter ce comportement sans aucune connexion. Alors, comment puis-je créer new WebException(..., ..., ..., ...) avec nécessaire StatusCode

Répondre

1

La partie la plus délicate est ici que si le constructeur WebException(String, Exception, WebExceptionStatus, WebResponse) est librement disponible, le HttpWebResponse est indiqué pour être créé seulement par HttpWebRequest (il y a des constructeurs, mais ils sont obsolètes).

Donc, puisque WebException accepte le résumé WebResponse plutôt que HttpWebResponse, je suggère de créer une classe MockHttpWebResponse ou quelque chose. Je ne sais pas exactement quelles sont les variables dont vous avez besoin. Par conséquent, je vais vous lier à HttpWebResponse source pour que vous puissiez récupérer les variables essentielles.

Ensuite, vous utilisez cette classe dans le constructeur comme ici:

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

... ou quelque chose de similaire. Je pense que vous savez mieux ce qui est nécessaire pour votre scénario. ;)

1

Vous devez personnaliser une classe pour augmenter le code d'état HTTP:

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

Vous pouvez utiliser des réflexions pour accomplir cela. Dans l'exemple suivant, j'ai créé une exception web avec la réponse que j'ai ajustée (en utilisant également des réflexions).

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;