2009-05-12 8 views
1

Une partie de mon travail consiste à utiliser un service Web externe, pour lequel j'ai généré du code de proxy client (à l'aide de l'outil WSDL.exe).Test d'un service Web pour les champs obligatoires manquants dans .NET

Je dois tester que le service Web gère correctement l'absence de champs obligatoires. Par exemple, le nom et le prénom sont obligatoires - s'ils sont absents de l'appel, un bloc d'erreur SOAP doit être renvoyé.

Comme vous l'avez peut-être deviné, je ne peux pas exclure les champs obligatoires de mon appel de service Web lors de l'utilisation du code proxy généré automatiquement en raison de la vérification du schéma à la compilation.

Ce que j'ai fait à la place est d'utiliser HttpWebRequest et HttpWebResponse pour envoyer/recevoir une enveloppe SOAP formatée manuellement au service web. Cela fonctionne, mais comme le service renvoie un code d'état HTTP 500, une exception est levée sur le client et la réponse (contenant le bloc d'erreur SOAP dont j'ai besoin) est null. Fondamentalement, j'ai besoin du flux de retour pour obtenir les données d'erreur afin que je puisse terminer mon test unitaire. Je sais que les données correctes sont renvoyées parce que je peux le voir sur ma trace de Fiddler, mais je ne peux pas l'obtenir dans mon code.

Voici ce que je fais pour l'appel manuel, avec les noms changés pour protéger les innocents:

private INVALID_POST = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" + 
    "<soap:Envelope ...rest of SOAP envelope contents..."; 

private void DoInvalidRequestTest() 
{ 
    HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("https://myserviceurl.svc"); 
    request.Method = "POST"; 
    request.Headers.Add("SOAPAction", 
     "\"https://myserviceurl.svc/CreateTestThing\""); 
    request.ContentType = "text/xml; charset=utf-8"; 
    request.ContentLength = INVALID_POST.Length; 
    request.KeepAlive = true; 

    using (StreamWriter writer = new StreamWriter(request.GetRequestStream())) 
    { 
     writer.Write(invalidPost); 
    } 

    try 
    { 
     // The following line will raise an exception because of the 500 code returned 
     HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
     if (response.StatusCode == HttpStatusCode.OK) 
     { 
      using (StreamReader reader = new StreamReader(response.GetResponseStream())) 
      { 
       string reply = reader.ReadToEnd(); 
      } 
     } 
    } 
    catch (Exception ex) 
    { 
     ... My exception handling code ... 
    } 
} 

S'il vous plaît noter que je ne suis pas en utilisant WCF, juste WSE 3.

Répondre

1

Qu'en est- écrire votre propre SoapHttpClientProtocol et en utilisant SoapExtensions?

[WebServiceBinding()] 
    public class WebService 
    : System.Web.Services.Protocols.SoapHttpClientProtocol 
    { 
     [SoapTrace] 
     public object[] MethodTest(string param1, string param2) 
     { 
      object[] result = this.Invoke("MethodTest", new object[] { param1, param2 }); 
      return (object[])result[0]; 
     } 
    } 
+0

Merci beaucoup pour votre réponse, Ishtar. Malheureusement, cela ne fonctionne pas pour moi - en arrière-plan, Invoke() tente de sérialiser les paramètres d'objet dans les types forts correspondants qui ont été générés par l'outil wsdl.exe. Si un paramètre me manque, définissez-le sur une chaîne vide ou définissez-le sur null, j'obtiens une exception XmlSerializer et le service Web n'est pas appelé :( –

Questions connexes