使用VBA来使用WCF Web服务,如何更改绑定?

时间:2014-06-02 12:36:04

标签: wcf vba soap access-vba

我正在开发Access 2010'工具'希望能够让我将本地Access数据库与在线数据库同步(托管在我们无法控制或直接访问的服务器上)。我的背景不在VBA或VB.net中,所以我对这种语言还不熟悉,所以任何帮助或建议都会受到赞赏。到目前为止,这是我编写的一个测试,用于验证连接的能力,并在我们获得有效响应时更好地理解返回的内容。

Public Sub SendXML()
    Dim myHTTP As MSXML2.ServerXMLHTTP60
    Dim myDom As MSXML2.DOMDocument
    Dim myXML As String
    Set myHTTP = CreateObject("MSXML2.ServerXMLHTTP.6.0")
    Set myDom = CreateObject("MSXML2.DOMDocument")
    myDom.async = False
    myXML = "<s:Envelope xmlns:a=" & Chr(34) & "http://www.w3.org/2005/08/addressing" & Chr(34) & "xmlns:s=" & Chr(34) & "http://www.w3.org/2003/05/soap-envelope" & Chr(34) & "><s:Header><a:Action s:mustUnderstand=" & Chr(34) & "1" & Chr(34) & ">http://tempuri.org/IWcfService/Get_InitiativeList_CSV</a:Action></s:Header><s:Body><Get_InitiativeList_CSV xmlns=" & Chr(34) & "http://tempuri.org/" & Chr(34) & "><userID>MYUSERID</userID></Get_InitiativeList_CSV></s:Body></s:Envelope>"
    myDom.LoadXML (myXML)
    myHTTP.Open "post", "https://server/WcfService/WcfService.svc", False
    myHTTP.setRequestHeader "Content-Type", "application/xml"   
    'myHTTP.send (myDom.XML)
    myHTTP.send (myXML)
    MsgBox myHTTP.responseText
End Sub

我回来了:

The server cannot service the request because the media type is unsupported.

上面有几点需要注意。我尝试了两种不同的方法来创建XML字符串。如上所示创建它并将原始文本发送到服务器。如上所示创建字符串并使用loadXML创建字符串。我不知道为什么一个会比另一个好,但两个都返回了同样的错误。

现在,我已经尝试过SOA Cleaner Express,并且能够成功连接到服务并获取数据。由于SOA Cleaner能够连接我想到使用RAW SOAP / XML字符串SOA发送在VBA可能是一个很好的起点。我注意到使用SOA清理器它有一个WCF绑定为WsHttpBinding,如果我将此绑定更改为BasicHttpBinding,我会收到类似于VBA中的错误消息,确切地说:

Content Type text/xml; charset=utf-8 was not supported by service 

甚至不确定我是朝着正确的方向前进,但如果我是,我该如何设置或更改绑定&#39;在VBA?这里还有别的东西吗?我确信这很简单,但就像我说我没有VBA背景,WCF和SOAP对我来说也有点新鲜。

我感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

对于初学者,来自客户端的绑定必须与服务匹配,因此如果服务仅支持wsHttpBinding,则客户端也必须使用该服务。

为了增加从VBA调用WCF服务的灵活性,包括指定绑定的功能,您可能希望使用monikers。以下是在VBA中构建和使用的服务monkier的示例:

Dim addr As String
addr = "service:mexAddress=""net.tcp://localhost:7891/Test/WcfService1/Service1/Mex"","
addr = addr + "address=""net.tcp://localhost:7891/Test/WcfService1/Service1/"","
addr = addr + "contract=""IService1"", contractNamespace=""http://tempuri.org/"","
addr = addr + "binding=""NetTcpBinding_IService1"", bindingNamespace=""http://tempuri.org/"""

Dim service1 As Object
Set service1 = GetObject(addr)

MsgBox service1.GetData(12)

以下是一些包含更多信息的链接,包括此代码段的来源:

http://msdn.microsoft.com/en-us/library/ms752245(v=vs.110).aspx http://damianblog.com/2009/07/05/excel-wcf/

答案 1 :(得分:0)

这可能是牵强附会,但鉴于第二个错误比第一个错误更具描述性,您是否尝试过指定字符集?

myHTTP.setRequestHeader "Content-Type", "application/xml; charset=utf-8"