2017-09-29 2 views
0

J'ai été bloqué sur ce problème depuis un certain temps maintenant. J'essaie de créer une requête SOAP basée sur les informations d'un fichier WSDL à envoyer à un service Web et récupérer une réponse. D'après ce que j'ai lu en ligne, cela devrait être un processus assez simple, et tous les tutoriels et les guides ont été presque les mêmes.500 Erreur de serveur interne lors de l'accès au service Web à partir de C#

code:

string message = @"<?xml version=""1.0"" encoding=""utf-8""?> 
      <soap:Envelope xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" xmlns:soap=""http://schemas.xmlsoap.org/soap/envelope/""> 
       <soap:Body> 
        <GetQuote xmlns=""http://www.webservicex.net/"">  
         <symbol>BB</symbol>   
        </GetQuote> 
       </soap:Body> 
      </soap:Envelope>"; 

     HttpWebRequest webRequest = (HttpWebRequest) WebRequest.Create(@"http://www.webservicex.net/stockquote.asmx"); 
     webRequest.Headers.Add(@"SOAPAction:http://www.webservicex.net/GetQuote"); 
     webRequest.ContentType = "text/xml;charset=\"utf-8\""; 
     webRequest.Method = "POST"; 

     XmlDocument soapEnvelopeXml = new XmlDocument(); 
     soapEnvelopeXml.LoadXml(message); 

     using (Stream stream = webRequest.GetRequestStream()) 
     { 
      soapEnvelopeXml.Save(stream); 
     } 

     using (WebResponse response = webRequest.GetResponse()) 
     { 
      using (StreamReader rd = new StreamReader(response.GetResponseStream())) 
      { 
       string soapResult = rd.ReadToEnd(); 
       Console.WriteLine(soapResult); 
      } 
     } 

Je ne dois pas être clair sur la façon dont tout cela fonctionne, à ma compréhension de la requête HTTP est envoyée au service Web que nous précisons dans la méthode WebRequest.Create() avec quelques-uns D'autres informations comme le SOAPAction qui im ​​guessing est la méthode réelle que nous voulons invoquer? Dans le corps du message, l'espace de noms XML est lié et les éléments ont accès via cet espace de noms (GetQuote, symbole). Donc, pour moi, tout sonne comme si ça devait couler. Il doit y avoir quelque chose que je suis manquant ou mal faire parce que j'obtiens une erreur de serveur interne quand j'essaye de lire la réponse. J'essaie d'accéder à un service Web très basique à partir de www.webservicex.com. Les liens sont fournis ci-dessous.

Link Service: http://www.webservicex.net/stockquote.asmx

WSDL: http://www.webservicex.net/stockquote.asmx?WSDL

Répondre

0

Cela peut être dû à votre choix de données de test. Dans un petit test, j'ai trouvé que la soumission de BB renvoyait une réponse d'exception, mais que la soumission d'APL (Apple) renvoyait correctement une cotation boursière. Il semble que l'API n'est pas très bien conçue et explose quand on lui demande des données qu'elle ne gère pas?

En remarque parfois, il renvoie également la réponse d'exception pour APL. On dirait que leur API n'est peut-être pas très bien conçue.

Vous pouvez le tester vous-même en accédant au http://www.webservicex.net/stockquote.asmx?op=GetQuote qui vous offre une interface permettant de soumettre des tests.

+0

C'est exactement ma confusion. J'ai utilisé cette interface et j'ai même utilisé les exemples de code pour structurer mes messages SOAP. –

0

D'abord, vous devez vous assurer que votre service Web est en cours d'exécution ou non. Vous pouvez accéder au service Web uniquement lorsqu'il est en mode exécution. Si ce n'est pas en cours d'exécution exécutez-le puis accédez à partir de votre application ...

+1

En règle générale, un '500' n'indique pas qu'un service n'est pas en cours d'exécution, un' 503' le fait. Un '500' signifie une erreur dans l'application (ou peut-être IIS lui-même). –