通过 VBScript 调用 WCF 服务 [英] Calling WCF service by VBScript
问题描述
有一个WCF服务有配置:
There is a WCF service with configuration:
<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
运行脚本时出现此错误:
When running the script this error appears:
客户端:WSDLReader:分析 WSDL 文件失败 HRESULT=0x80004005 - WSDLReader:服务初始化失败 HRESULT=0x80004005 - WSDL 服务:服务 MyService 端口初始化失败 HRESULT=0x80004005 - WSDLPort:分析端口 BasicHttpBinding_IMyService 的绑定信息失败 HRESULT=0x80004005 - WSDLPort:无法初始化端口 BasicHttpBinding_IMyService 的操作 HRESULT=0x80004005 - WSDLOperation:操作//def:portType[@name="IMyService"]/def:operation[@name="MyMethod"] 未在 porttype 部分找到HRESULT=0x80004005
Client: WSDLReader:Analyzing the WSDL file failed HRESULT=0x8 0004005 - WSDLReader:Initialization of service failed HRESULT=0x80004005 - WSDL Service:Initialization of the port for service MyService failed HRESULT =0x80004005 - WSDLPort:Analyzing the binding information for port BasicHttpBinding_IMyService failed HRESULT=0x80004005 - WSDLPort:An operation for port BasicHttpBinding_IMyService could not be initialized HRESULT=0x8000 4005 - WSDLOperation:The operation //def:portType[@name="IMyService"]/ def:operation[@name="MyMethod"] was not found in the porttype section HRESULT=0x80004005
怎么了?请帮忙.
谢谢 Cheeso 的回答.MSSOAP 的问题似乎是它要求所有 xsd 模式都内联包含在生成的 WSDL 文件中.WCF 默认不这样做.
Thank you, Cheeso, for the answer. The problem with the MSSOAP appears to be that it requires all xsd schemas to be included inline in the generated WSDL file. WCF doesn't do it by default.
推荐答案
不要使用 MSSOAP.我认为在过去的 3 或 4 年里,它现在已经失去支持.考虑使用 XmlHttp,它是 MSXML 的一部分,受支持并继续得到维护.您必须手动构造一个 SOAP 信封.但这种方式更可靠.
Don't use MSSOAP. I think it is out of support now, for the past 3 or 4 years. Consider using the XmlHttp, which is part of MSXML, and is supported and continues to be maintained. You will have to construct a SOAP envelope manually. But it's more reliable this way.
示例代码
' 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. '
仅供参考:请参阅which-version-of-msxml-should-i-使用了解如何选择 MSXML 版本.
FYI: See which-version-of-msxml-should-i-use to learn how to select a version of MSXML.
这篇关于通过 VBScript 调用 WCF 服务的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!