Ms access 使用VBA使用WCF web服务,如何更改绑定?
我正在开发一个Access 2010“工具”,希望它能让我将本地Access数据库与在线数据库同步(托管在一个我们无法控制或直接访问的服务器上)。我的背景不是VBA或VB.net,因此我对这门语言相当陌生,因此任何帮助或建议都将不胜感激。到目前为止,这是我编写的一个测试,用于验证连接能力,并更好地理解当我们得到有效响应时返回的内容Ms access 使用VBA使用WCF web服务,如何更改绑定?,ms-access,wcf,soap,vba,Ms Access,Wcf,Soap,Vba,我正在开发一个Access 2010“工具”,希望它能让我将本地Access数据库与在线数据库同步(托管在一个我们无法控制或直接访问的服务器上)。我的背景不是VBA或VB.net,因此我对这门语言相当陌生,因此任何帮助或建议都将不胜感激。到目前为止,这是我编写的一个测试,用于验证连接能力,并更好地理解当我们得到有效响应时返回的内容 Public Sub SendXML() Dim myHTTP As MSXML2.ServerXMLHTTP60 Dim myDom As MSXM
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
上面有几点需要注意。我尝试了两种不同的方法来创建XML字符串。一个是如上面所示创建它并将原始文本发送到服务器。如上图所示创建字符串,并使用loadXML
创建字符串。我不知道为什么一个会比另一个好,但两个都返回相同的错误
现在,我已经尝试了SOA Cleaner Express,并且能够成功地连接到服务并获取数据。由于SOA Cleaner能够连接,我认为使用VBA中SOA发送的原始SOAP/XML字符串可能是一个很好的起点。我注意到,使用SOA cleaner时,它有一个WCF绑定作为WsHttpBinding
,如果我将此绑定更改为BasicHttpBinding
,我会得到一个与VBA中类似的错误消息,确切地说:
Content Type text/xml; charset=utf-8 was not supported by service
我甚至不确定我的方向是否正确,但如果我正确,我如何在VBA中设置或更改“绑定”?这里还有别的事吗?我相信这很简单,但正如我所说,我没有VBA背景,WCF和SOAP对我来说也有些陌生
非常感谢您的帮助。首先,来自客户端的绑定必须与服务匹配,因此如果服务仅支持
wsHttpBinding
,客户端也必须使用该绑定
为了增加从VBA调用WCF服务的灵活性,包括指定绑定的能力,您可能希望改用名字。下面是在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)
以下是一些包含更多信息的链接,包括此代码段的源代码:
这可能有些牵强,但考虑到第二个错误比第一个错误更具描述性,您是否尝试过指定字符集
myHTTP.setRequestHeader "Content-Type", "application/xml; charset=utf-8"
感谢您的回复和链接。我两个都去过,很快就迷路了。我需要更多的信息来开始。首先,从一个快速的谷歌,我不认为我试图消费的服务有一个“MexAddress”,也不知道或理解什么是MexAddress。我发布到服务的包是用SOAP格式化的(如果有帮助的话)。实际上,SOAP是WCF的默认协议。您能为服务获取一个WSDL来描述它吗?(在浏览器中的服务URL末尾添加“?WSDL”)。您如何知道服务上有哪些可用操作?是的,我可以通过浏览器获取WSDL。我还使用了SOA Cleaner Pro来加载WSDL并获得特定的操作。我还有一份技术文档,描述了操作(中的预期内容和返回的内容)。谢谢,但不幸的是,在同一错误消息中添加了
charset=utf-8 results
。
myHTTP.setRequestHeader "Content-Type", "application/xml; charset=utf-8"