【问题标题】:How to consume a webservice in Excel 2013如何在 Excel 2013 中使用 Web 服务
【发布时间】:2016-06-06 00:15:30
【问题描述】:

我有一个可以使用 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

我知道 web 服务有效,因为我创建了其他成功使用 web 服务的客户端。我对这个 Excel 2013 宏做错了什么?

**EDIT -- 上面使用的是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 引用)。

我使用的肥皂 xml 与 WCFClient 工具中的完全相同。

提前致谢!

【问题讨论】:

  • .Open "GET", sURL, False?确定您的服务需要带有GET 请求的请求正文吗?也许.Open "POST", sURL, False
  • 如果我尝试 POST,我会收到“400”错误。

标签: excel vba web-services


【解决方案1】:

我终于通过运行 WCFClient 并查看 fiddler 中的请求来使其工作。

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

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

并将请求正文更改为:

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

以及将动词更改为 POST -- 有效!

【讨论】:

    【解决方案2】:

    我认为您缺少&lt;a:messageId&gt; 的结束标记:

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

    【讨论】:

    • 谢谢,这并没有解决。我决定只编写一个使用该服务的控制台应用程序。然后在我的 excel 宏中,我只需要打开控制台应用程序。
    • 也许在&lt;a:ReplyTo&gt; 部分开始之前缺少结束标记?
    猜你喜欢
    • 1970-01-01
    • 2016-02-29
    • 1970-01-01
    • 1970-01-01
    • 2010-10-03
    • 1970-01-01
    • 2013-12-15
    • 1970-01-01
    相关资源
    最近更新 更多