如何在Excel 2013中使用Web服务

时间:2016-06-05 01:55:01

标签: excel vba web-services

我有一个可以使用Microsoft的WCFTestClient.exe调用的Web服务。但是,当我尝试在Excel 2013中创建一个宏来调用Web服务时,它不起作用。

它没有错误,但它实际上并没有在Web服务器上运行方法(RunScript)。

这是我的代码:

Private Sub web()


Dim sURL As String
Dim sEnv As String
Dim objHTTP As Object
Set objHTTP = CreateObject("MSXML2.XMLHTTP.6.0")
 sURL = "http://testserver:9001/TestService"

 On Error GoTo ErrorLabel


 sEnv = sEnv & "<s:Envelope xmlns:a=""http://www.w3.org/2005/08/addressing"" xmlns:s=""http://www.w3.org/2003/05/soap-envelope"" > "
 sEnv = sEnv & " <s:Header>"
 sEnv = sEnv & "  <a:Action s:mustUnderstand=""1"">http://tempuri.org/TestService/RunScript</a:Action>"
 sEnv = sEnv & "  <a:MessageID>urn:uuid:9405af92-1f5b-4ead-87</a:MessageID> <a:ReplyTo>"
 sEnv = sEnv & "        <a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address>"
 sEnv = sEnv & "    </a:ReplyTo>"
 sEnv = sEnv & " </s:Header>"
 sEnv = sEnv & "  <s:Body>"
 sEnv = sEnv & "    <RunScript xmlns=""http://tempuri.org/""/> "
 sEnv = sEnv & "  </s:Body>"
 sEnv = sEnv & "</s:Envelope>"

 With objHTTP
    .Open "GET", sURL, False
    .setRequestHeader "Content-Type", "text/xml"
    .send sEnv
End With

 Set objHTTP = Nothing
ExitLabel:
   'Clean-up code, if any, goes here
   Exit Sub

ErrorLabel:
    'Error-handling code goes here
    Resume ExitLabel

End Sub

我知道webservice有效,因为我已经创建了其他成功使用了webservice的客户端。我在Excel 2013宏中做错了什么?

**编辑 - 上面是使用wsHTTPBinding,我把它切换为使用basicHTTPBinding:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
  <s:Header>
    <Action s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">http://tempuri.org/TestService/RunScript</Action>
  </s:Header>
  <s:Body>
    <RunScript xmlns="http://tempuri.org/" />
  </s:Body>
</s:Envelope>

我在小提琴手中跑了但最终获得了504 - 网关时间。运行WCFClient并添加服务以及编写一个小型控制台应用程序以使用它(通过添加Web引用)。

我使用的soap xml是WCFClient工具中的精确版。

提前致谢!

2 个答案:

答案 0 :(得分:0)

我认为您错过了<a:messageId>的结束标记:

<s:Envelope xmlns:a="http://www.w3.org/2005/08/addressing" xmlns:s="http://www.w3.org/2003/05/soap-envelope" >  
  <s:Header>  
  <a:Action s:mustUnderstand="1">http://tempuri.org/TestService/RunScript</a:Action>  
  <a:MessageID>urn:uuid:9405af92-1f5b-4ead-87 
    <a:ReplyTo>        
      <a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address>    
    </a:ReplyTo> 
    <!-- missing close tag for a:MessageID -->
  </s:Header>  
  <s:Body>    
  <RunScript xmlns="http://tempuri.org/"/>   
  </s:Body>
</s:Envelope>

答案 1 :(得分:0)

我终于通过运行WCFClient并在fiddler中查看请求来实现它。

似乎将“SOAPAction”添加为标题:

SOAPAction: "http://tempuri.org/TestService/RunScript" 

并将Request主体更改为:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Body><RunScript xmlns="http://tempuri.org/"/></s:Body></s:Envelope>

以及将动词更改为POST - 工作!