2009-06-03 8 views
10

Es gibt einen WCF-Dienst mit Konfiguration:Berufung WCF-Dienst von 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> 

Dieses Skript soll es nennen:

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 

Wenn das Skript ausgeführt wird dieser Fehler angezeigt:

Client: WSDLReader: Analysieren der WSDL-Datei fehlgeschlagen HRESULT = 0 x 8 0009005 - WSDLReader: Initialisierung des Diensts fehlgeschlagen HRESULT = 0 x 80004005 - WSDL-Dienst: Initialisierung des p ort für Service MyService fehlgeschlagen HRESULT = 0x80004005 - WSDLPort: Analysieren der Bindungsinformationen für Port BasicHttpBinding_IMyService fehlgeschlagen HRESULT = 0x80004005 - WSDLPort: eine Operation für Port BasicHttpBinding_IMyService konnte nicht initialisiert werden HRESULT = 0x8000 4005 - WSDLOperation: Die Operation // def: portType [@ name = "IMyService"]/ def: Betrieb [@ name = "MyMethod"] nicht in der type Abschnitt HRESULT gefunden = 0x80004005

Was nicht in Ordnung ist? Bitte, helfen Sie.

Edit:

Danke, Cheeso, für die Antwort. Das Problem mit der MSSOAP scheint zu sein, dass alle xsd-Schemas in die generierte WSDL-Datei eingebunden werden müssen. WCF tut es nicht standardmäßig.

+1

Wenn Sie die XSDs in der WSDL verwenden möchten, können Sie den WCF-Dienst so ändern, dass er "flattert". http://www.bing.com/search?q=Wcf+flatten+wsdl Wenn Sie keine Kontrolle über das WCF-Ende haben, können Sie immer noch eine WSDL erstellen, die monolithisch ist und funktionieren sollte. Aber es gibt andere, ernstere Probleme mit MSSOAP. – Cheeso

Antwort

15

Verwenden Sie nicht MSSOAP. Ich denke, dass es in den letzten 3 oder 4 Jahren nicht mehr unterstützt wird. Erwägen Sie die Verwendung von XmlHttp, das Teil von MSXML ist und unterstützt wird und weiterhin gepflegt wird. Sie müssen einen SOAP-Umschlag manuell erstellen. Aber es ist auf diese Weise zuverlässiger.

Beispielcode

' 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: Siehe which-version-of-msxml-should-i-use zu lernen, wie eine Version von MSXML auszuwählen.

+0

@Cheeso: Auch in VBScript sollte XML nicht über eine String-Verkettung erstellt werden. Es sollte über MSXML erstellt werden, dann sollte die XML-Eigenschaft gesendet werden. –

+1

Guter Punkt, stimme absolut zu. Sie müssen ein Dokument über das DOM erstellen. In diesem Fall habe ich eine Schnell-n-Dirty-Zeichenfolge verwendet, um zu zeigen, was gerade auf dem Draht vor sich geht. – Cheeso

+0

@Cheeso: Gut, aber die Leute kopieren diese Antworten und benutzen sie wie sie sind. Wir müssen aufpassen, schlechte Gewohnheiten nicht zu lehren. OTOH du könntest ein "versuch das nicht zu Hause - benutze MSXML statt" Kommentar vor dem String concat ... –