2009-06-03 1 views
10

Существует ФОС службы с конфигурацией:Вызов службы WCF с помощью 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> 

Этот скрипт должен назвать его:

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 

При запуске сценария появляется эта ошибка:

Клиент: WSDLReader: не удалось проанализировать файл WSDL HRESULT = 0x8 0004005 - WSDLReader: Инициализация службы не сработала HRESULT = 0x80004005 - Служба WSDL: Инициализация p ort для обслуживания MyService не удалось HRESULT = 0x80004005 - WSDLPort: анализ информации привязки для порта BasicHttpBinding_IMyService failed HRESULT = 0x80004005 - WSDLPort: операция для порта BasicHttpBinding_IMyService не может быть инициализирована HRESULT = 0x8000 4005 - WSDLOperation: операция // def: portType [@ имя = "IMyService"]/ четкости: работа [@ имя = "MyMethod"] не был найден в PortType разделе HRESULT = 0x80004005

Что происходит не так? Пожалуйста помоги.

Edit:

Спасибо, Cheeso, за ответ. Проблема с MSSOAP заключается в том, что она требует, чтобы все xsd-схемы были включены в строку в созданном файле WSDL. WCF не делает это по умолчанию.

+1

Если вы хотите XSD в WSDL, вы можете изменить службу WCF, чтобы «сгладить» ее. http://www.bing.com/search?q=Wcf+flatten+wsdl Если у вас нет контроля над концом WCF, вы все равно можете построить WSDL, который является монолитным и должен работать. Но есть и другие, более серьезные проблемы с MSSOAP. – Cheeso

ответ

15

Не используйте MSSOAP. Я думаю, что сейчас это не поддерживается, последние 3 или 4 года. Подумайте об использовании XmlHttp, который является частью MSXML, и поддерживается и продолжает поддерживаться. Вам нужно будет создать SOAP-конверт вручную. Но это более надежно.

пример кода

' 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: См which-version-of-msxml-should-i-use, чтобы узнать, как выбрать версию MSXML.

+0

@ Чисо: даже в VBScript XML не следует создавать с помощью конкатенации строк. Он должен быть создан через MSXML, затем должно быть отправлено свойство .xml. –

+1

Хорошая точка, Абсолютно согласен. Правильное решение - создать документ через DOM. В этом случае я использовал быстро-n-грязную строку, чтобы показать, что происходит на проводе. – Cheeso

+0

@ Чисо: Хорошо, но люди копируют эти ответы и используют их как есть. Мы должны быть осторожны, чтобы не учить плохие привычки. OTOH вы можете добавить «не пытайтесь это дома - используйте MSXML вместо» комментарий перед строкой concat ... –