2009-09-22 24 views
1

J'essaie d'utiliser un service de trafic Web. Un exemple de requête SOAP est donné ci-dessous.Ajout d'un en-tête SOAP personnalisé à l'aide de C#/ASP.NET

J'ai créé une classe proxy dans C# en utilisant Wsdl.exe à partir de la structure WSDL. Ce que je pense que je dois faire maintenant en quelque sorte insérer l'en-tête SOAP «authentifier» dans la structure SOAP pour l'appel de la méthode. Je ne suis pas sûr comment ajouter l'en-tête à l'appel de méthode de service?

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:ns1="http://www.inteleacst.com.au/wsdl" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> 
    <SOAP-ENV:Header> 
    <ns1:authenticate> 
     <SOAP-ENC:Struct> 
     <username>username</username> 
     <password>password</password> 
     </SOAP-ENC:Struct> 
    </ns1:authenticate> 
    </SOAP-ENV:Header> 
    <SOAP-ENV:Body> 
    <ns1:getAllTraffic> 
     <States SOAP-ENC:arrayType="xsd:string[3]" xsi:type="ns1:State_Arr"> 
     <item xsi:type="xsd:string">VIC</item> 
     <item xsi:type="xsd:string">NSW</item> 
     <item xsi:type="xsd:string">NT</item> 
     </States> 
     <EventCodes SOAP-ENC:arrayType="xsd:int[1]" xsi:type="ns1:EventCode_arr"> 
     <item xsi:type="xsd:int">802</item> 
     </EventCodes> 
    </ns1:getAllTraffic> 
    </SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

Voici le code de la classe proxy pour appeler la méthode de service Web.

[System.Web.Services.Protocols.SoapRpcMethodAttribute("http://webservice.intelecast.com.au/traffic/PublicSoap/server.php#getAllTraffic", RequestNamespace="http://webservice.intelecast.com.au/traffic/PublicSoap/server.php", ResponseNamespace="http://webservice.intelecast.com.au/traffic/PublicSoap/server.php")] 
     [return: System.Xml.Serialization.SoapElementAttribute("return")] 
     public TrafficInfo[] getAllTraffic(string[] States, int[] EventCodes) { 
      object[] results = this.Invoke("getAllTraffic", new object[] { 
         States, 
         EventCodes}); 
      return ((TrafficInfo[])(results[0])); 
     } 

Répondre

4

Recherche sur le Web J'ai trouvé un article sur un forum sur un problème très similaire et une bonne solution. Disponible ici - forums.asp.net/t/1137408.aspx

2

Ajout d'en-têtes SOAP est une de ces choses qui a obtenu plus alambiquée avec WCF par rapport à la précédente « Ajouter Web Service de référence » dans Visual Studio .NET 2003/2005 et la création d'une extension SOAP. Pour le faire dans WCF, vous devez ajouter un comportement EndPointBehavior. Il y a quelques exemples autour de, google sur IEndpointBehavior et IClientMessageInspector. Ce article fournit un bel exemple succinct, mais vous devrez peut-être l'agrandir.

+0

Je n'utilise pas WCF. –

+1

Vous devriez utiliser une extension Soap http://msdn.microsoft.com/en-us/library/system.web.services.protocols.soapextension(VS.71).aspx. – sipwiz

+0

Merci, j'ai utilisé avec succès une extension SoapExtension pour surmonter le problème d'en-tête. –