10

有一个带有配置的 WCF 服务:

<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 服务:初始化服务 MyService 的端口失败 HRESULT =0x80004005 - WSDLPort:分析端口 BasicHttpBinding_IMyService 的绑定信息失败 HRESULT =0x80004005 - WSDLPort: 端口 BasicHttpBinding_IMyService 的操作无法初始化 HRESULT=0x8000 4005 - WSDLOperation: 操作 //def:portType[@name="IMyService"]/def:operation[@name="MyMethod"] 没有在 porttype 部分中找到 HRESULT=0x80004005

出了什么问题?请帮忙。

编辑:

谢谢你,芝士,你的回答。MSSOAP 的问题似乎在于它要求所有 xsd 模式都内嵌在生成的 WSDL 文件中。WCF 默认情况下不这样做。

4

1 回答 1

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

仅供参考:请参阅which-version-of-msxml-should-i-use以了解如何选择 MSXML 版本。

于 2009-06-03T19:48:28.540 回答