2009-06-03 8 views
10

Il y a un service WCF avec la configuration:appel service WCF par VBScript

<services> 
    <service name="MyService" behaviorConfiguration="MyServiceBehavior"> 
    <endpoint 
     binding="basicHttpBinding" 
     contract="IMyService" /> 
    <host> 
     <baseAddresses> 
     <add baseAddress="http://localhost:8001/MyService" /> 
     </baseAddresses> 
    </host> 
    </service> 
</services> 

<behaviors> 
    <serviceBehaviors> 
    <behavior name="MyServiceBehavior"> 
     <serviceMetadata httpGetEnabled="True" /> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 

Ce script est censé appeler:

Option Explicit 

Dim soapClient 
Dim serviceUri 
Dim serviceName 
Dim portName 
Dim result 

serviceUri = "http://localhost:8001/MyService" 
serviceName = "MyService" 
portName = "BasicHttpBinding_IMyService" 

Set soapClient = CreateObject("MSSOAP.soapClient") 
soapClient.ClientProperty("ServerHTTPRequest") = True 
soapClient.mssoapinit serviceUri & "?WSDL", serviceName, portName 

Lors de l'exécution du script cette erreur apparaît:

Client: WSDLReader: Échec de l'analyse du fichier WSDL HRESULT = 0x8 0004005 - WSDLReader: Échec de l'initialisation du service HRESULT = 0x80004005 - Service WSDL: Initialisation du p ort pour le service MyService n'a pas HRESULT = 0x80004005 - WSDLPort: Analyser les informations de liaison pour le port BasicHttpBinding_IMyService n'a HRESULT = 0x80004005 - WSDLPort: Une opération pour BasicHttpBinding_IMyService du port n'a pas pu être initialisé HRESULT = 0x8000 4005 - WSDLOperation: L'opération // def: portType [@ name = "IMyService"]/DEF : opération [@ name = "MyMethod"] n'a pas été trouvé dans la section porttype HRESULT = 0x80004005

Qu'est-ce qui ne va pas? S'il vous plaît, aidez.

Edit:

Merci, Cheeso, pour la réponse. Le problème avec MSSOAP semble être que tous les schémas xsd doivent être inclus dans le fichier WSDL généré. WCF ne le fait pas par défaut.

+1

Si vous voulez les XSD dans le WSDL, vous pouvez modifier le service WCF pour "l'aplatir". http://www.bing.com/search?q=Wcf+flatten+wsdl Si vous n'avez aucun contrôle sur la fin de WCF, vous pouvez toujours construire un WSDL qui est monolithique et devrait fonctionner. Mais il y a d'autres problèmes plus sérieux avec MSSOAP. – Cheeso

Répondre

15

N'utilisez pas MSSOAP. Je pense que c'est hors de support maintenant, depuis 3 ou 4 ans. Envisagez d'utiliser XmlHttp, qui fait partie de MSXML, et est pris en charge et continue d'être géré. Vous devrez construire une enveloppe SOAP manuellement. Mais c'est plus fiable de cette façon.

exemple de code

' URL to the WCF service' 
url= "http://server:port/Wcf.Service.Address" 

Dim requestDoc 
Set requestDoc = WScript.CreateObject("MSXML2.DOMDocument.6.0") 

Dim root 
Set root = requestDoc.createNode(1, "Envelope", "http://schemas.xmlsoap.org/soap/envelope/") 
requestDoc.appendChild root 

Dim nodeBody 
Set nodeBody = requestDoc.createNode(1, "Body", "http://schemas.xmlsoap.org/soap/envelope/") 
root.appendChild nodeBody 

Dim nodeOp 
Set nodeOp = requestDoc.createNode(1, "Register", "urn:Your.Namespace.Here") 
nodeBody.appendChild nodeOp 

Dim nodeRequest 
Set nodeRequest = requestDoc.createNode(1, "request", "urn:Your.Namespace.Here") 
'content of the request will vary depending on the WCF Service.' 
' This one takes just a plain string. ' 
nodeRequest.text = "Hello from a VBScript client." 

nodeOp.appendChild nodeRequest 

Set nodeRequest = Nothing 
Set nodeOp = Nothing 
Set nodeBody = Nothing 
Set root = Nothing 


'the request will look like this:' 
'  <s:Envelope xmlns:s='http://schemas.xmlsoap.org/soap/envelope/'> ' 
'   <s:Body> ' 
'   <Register xmlns='urn:Your.Namespace.Here'> ' 
'    <request>hello from a VBScript client.</request> ' 
'   </Register> ' 
'   </s:Body> ' 
'  </s:Envelope>' 


WSCript.Echo "sending request " & vbcrlf & requestDoc.xml 


dim xmlhttp 

set xmlhttp = WScript.CreateObject("MSXML2.ServerXMLHTTP.6.0") 
' set the proxy as necessary and desired ' 
xmlhttp.setProxy 2, "http://localhost:8888" 
xmlhttp.Open "POST", url, False 
xmlhttp.setRequestHeader "Content-Type", "text/xml" 
' set SOAPAction as appropriate for the operation ' 
xmlhttp.setRequestHeader "SOAPAction", "urn:Set.As.Appropriate" 
xmlhttp.send requestDoc.xml 

WScript.Echo vbcrlf & "Raw XML response:" & vbcrlf 
WSCript.Echo xmlhttp.responseXML.xml 

dim response 
set response= xmlhttp.responseXML 
'the response is an MSXML2.DOMDocument.6.0' 
'party on the response here - XPath, walk the DOM, etc. ' 

Pour votre information: Voir which-version-of-msxml-should-i-use pour apprendre comment choisir une version de MSXML.

+0

@Cheeso: même dans VBScript, XML ne doit pas être créé par concaténation de chaîne. Il doit être créé à l'aide de MSXML, puis la propriété .xml doit être envoyée. –

+1

Bon point, tout à fait d'accord. La bonne chose à faire est de créer un document à travers le DOM. Dans ce cas, j'ai utilisé une chaîne rapide-n-sale pour montrer ce qui se passe sur le fil. – Cheeso

+0

@Cheeso: Bien, mais les gens copient ces réponses et les utilisent telles quelles. Nous devons faire attention à ne pas enseigner de mauvaises habitudes. OTOH vous pouvez ajouter un commentaire "ne pas essayer à la maison - utiliser MSXML à la place" avant la concat ... –

Questions connexes