2009-06-03 16 views
10

Hay un servicio de WCF con la configuración:Calling servicio WCF por 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> 

se supone Este script llamarlo:

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 

Cuando se ejecuta la secuencia de comandos aparece este error:

Cliente: WSDLReader: el análisis del archivo WSDL falló HRESULT = 0x8 0004005 - WSDLReader: la inicialización del servicio falló HRESULT = 0x80004005 - Servicio WSDL: Inicialización de la p ort para el servicio MyService failed HRESULT = 0x80004005 - WSDLPort: Análisis de la información de enlace para el puerto BasicHttpBinding_IMyService failed HRESULT = 0x80004005 - WSDLPort: No se pudo inicializar una operación para el puerto BasicHttpBinding_IMyService HRESULT = 0x8000 4005 - WSDLOperation: La operación // def: portType [@ name = "IMyService"]/ def: operación [@ name = "MiMetodo"] no se encontró en el HRESULT sección porttype = 0x80004005

lo que va mal? Por favor ayuda.

Editar:

Gracias, Cheeso, por la respuesta. El problema con MSSOAP parece ser que requiere que todos los esquemas xsd se incluyan en línea en el archivo WSDL generado. WCF no lo hace de manera predeterminada.

+1

Si desea los XSD en el WSDL, puede modificar el servicio WCF para "aplanarlo". http://www.bing.com/search?q=Wcf+flatten+wsdl Si no tiene control sobre el final de WCF, puede construir un WSDL que sea monolítico y debería funcionar. Pero hay otros problemas más serios con MSSOAP. – Cheeso

Respuesta

15

No utilice MSSOAP. Creo que ahora está fuera de soporte, durante los últimos 3 o 4 años. Considere usar XmlHttp, que es parte de MSXML, y es compatible y se mantiene. Deberá construir un sobre SOAP manualmente. Pero es más confiable de esta manera.

código de ejemplo

' 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. ' 

FYI: Ver which-version-of-msxml-should-i-use para aprender cómo seleccionar una versión de MSXML.

+0

@ Cheeso: incluso en VBScript, XML no se debe crear a través de la concatenación de cadenas. Se debe crear a través de MSXML, luego se debe enviar la propiedad .xml. –

+1

Buen punto, absolutamente de acuerdo. Lo correcto es crear un documento a través del DOM. En este caso, utilicé una cadena rápida y sucia para mostrar exactamente qué está pasando en el cable. – Cheeso

+0

@ Cheeso: Bien, pero las personas copian estas respuestas y las usan tal como están. Tenemos que tener cuidado de no enseñar malos hábitos. OTOH podría agregar un comentario "no intente esto en casa - use MSXML en su lugar" antes de la cadena concat ... –