XMLHTTP和ServerXMLHTTP之间的区别

22

我正在尝试编写一个Excel插件,可以将Web服务中的数据获取到Excel中。

用户只需要输入插件提供的函数名称即可使用。我发现了两篇实现VBA中HTTP请求的文章:XMLHTTPServerXMLHTTP

我在使用它们时遇到了困难,不知道该使用哪个。XMLHTTP和ServerXMLHTTP之间有什么区别呢?


3
一般来说,使用ServerXMLHTTP与HTTPS(安全的HTTP)通信时能够提供更好的控制。在Windows XP SP3中,即使安装了最新的MSXML更新,XMLHTTP在使用POST方法通过HTTPS发送数据时会失败。我不清楚Windows Vista、Windows 7或Windows 8是否也存在这个问题。 - Jay
2
请参考:http://support.microsoft.com/kb/290761 - Tim Williams
4个回答

33

Davuz,

Tim和Jay都提供了很好的背景信息和简明扼要的评论。我将只是稍微补充一下,并尝试给出一些上下文。

实质上,XMLHTTP对象用于创建XMLHttpRequest,该请求用于从网站/ Web服务器/ Web服务中请求数据。详情请参见维基百科链接:http://en.wikipedia.org/wiki/XMLHttpRequest

通常情况下,XMLHTTP通常用于客户端与服务器之间的通信,例如当您使用应用程序向Web服务发出请求时。 XMLHTTP对象还用于各种面向客户端的传输方法,例如文件传输协议(FTP),URL缓存和其他有用的工具。简而言之,XMLHTTP对象用于向某种类型的服务器发出请求,并请求客户端感兴趣的内容,无论是通过FTP连接访问服务器,从存储库获取一系列文件,还是从客户端处理数据的Web服务。

相比之下,ServerXMLHTTP旨在在服务器之间进行通信,与应用程序(客户端)进行通信并处理来自客户端的请求。虽然ServerXMLHTTP对象保持状态处于活动状态-这意味着发送/接收到目标的信息将保留用于当前连接的未来数据交易,但它也不主动支持某些XMLHTTP功能,例如“URL缓存、自动发现代理服务器、HTTP/1.1分块、离线支持以及对Gopher和FTP协议的支持”用于ServerXMLHTTP对象使用的http客户端堆栈。

从技术角度来看,XMLHTTP对象使用WinInet(Windows Internet Explorer)进行其功能,而ServerXMLHTTP对象使用客户端堆栈。 WinInet dll是Windows Internet协议管理的支柱,并且该dll用于处理HTTP、HTTPS、FTP等请求。

相比之下,当ServerXMLHTTP对象创建新的客户端http堆栈时-本质上是HTTP客户端的单独“会话”。使用单独的会话意味着在任何给定时间可能有多个ServerXMLHTTP对象实例处于活动状态,具体取决于内存和套接字连接的可用性。

简而言之 - 除了上面的评论中提到的信息外,XMLHTTP对象通常用于请求信息并以某种方式使用它,通常作为客户端。类似地,ServerXMLHTTP对象可能被用于请求数据,发送数据,甚至以相对高效的方式将接收的数据传递给另一个应用程序。这经常用于需要实时响应的业务应用程序,或者根据一系列请求向客户端提供数据,也许这些请求中还内置了条件等等。

希望这能解释清楚两者之间的区别。当阅读有关特定XMLHTTP类型请求的SO问题/答案时,会发现更多内容,以及深入研究MSDN和其他提供VB、VBA和Microsoft Office的互联网/XMLHTTPRequest特定材料文档的网站。

如果这有所帮助,或者您有其他问题/想法,请告诉我。

~JOL


3

我刚刚遇到了一个问题:当Web服务器(IIS)配置为仅允许Windows身份验证,而不是匿名访问时,ServerXMLHTTP调用会失败并显示身份验证错误,而XMLHTTP调用则不会。看起来XMLHTTP对象会自动处理发送Windows身份验证凭据的情况。我认为向ServerXMLHTTP对象添加NetworkCredentials应该是最好的解决方案,但我只能找到明文uid/pwd(显然不可接受)的基本身份验证。


3

ServerXMLHTTP对象使用winhttp,而XMLHTTP使用wininet。

由于wininet解析验证和代理配置等问题,因此在使用ServerXMLHTTP时不会出现这样的问题。但是,XMLHTTP中的有限灵活性可能会迫使您承担使用ServerXMLHTTP时的额外责任,例如必须协商服务器和目标端点身份验证机制,尽管winhttp中有助于解决此问题的方法。

将更多基于客户端的XMLHTTP移植到可配置的更强大的ServerXMLHTTP对象和类时,您可能会想知道为什么早些时候没有这样做。

甚至别让我开始谈论它们中任何一个失败的和已废弃的WPAD支持。:)


1

对我真正有帮助的是这个。

在定义对象之后:

Dim objHTTP As Object

Set objHTTP = createObject("MSXML2.ServerXMLHTTP")
...

然后加入这两行代码:

' --- Disregard any Proxy Settings and go straight to the IP address

    objHTTP.SetProxy 1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接