2010-07-30 50 views
2

我们在部署可在我们的开发环境中工作但未在生产中的Web服务时遇到问题。部分问题是我们的生产服务器负载均衡,因此要升级其中一台服务器,我们必须将其从负载平衡中解放出来,并试图单独测试服务器,这是一个挑战。为什么我可以从浏览器访问WSDL文件,但不能从应用程序访问?

我正在使用的计算机叫做Web01,我用来测试的计算机叫做Ts01。在这两台机器上,我修改了主机文件以将mydomain.com重定向到Web01上的网站的推测IP。

我测试每一台机器上访问Web服务的方法有两种:

  • 一个简单的浏览器调用http://www.mydomain.com/services/myservice.asmx?WSDL
  • 一个VB6测试应用程序,它使用上面通过SOAPClient引用的WSDL调用Web服务。

以下是测试结果:

 
        Browser    VB6 App 
    Ts01    OK     OK 
    Web01   OK     ERROR 

测试似乎除了用于安装在Web服务器上的VB6应用程序于所有情况确定。错误我得到的回复是:

-2147024809 - WSDLReader - :XML解析器未能在行号0,lineposition 0,原因是:系统无法找到对象指定WSDLReader HRESULT = 80070057的WSDL文件加载失败。

HRESULT =为0x1

我得到同样的错误回到Ts01,如果我在VB6应用程序提供一个糟糕的WSDL地址。似乎Web01上的VB6应用程序无法访问Web01上的Web服务DLL,这是一个大问题。

值得一提的是,它也适用于我的本地开发人员计算机,我的VB6应用程序和Web服务安装在同一台计算机上。

为什么VB6应用程序在与Web服务存在的同一个框中运行时,可能无法通过SOAPClient与Web服务进行通信?


我使用fiddler来检查我的本地计算机上调用我们的开发服务器的请求头。下面是浏览器和SoapClient的请求之间的区别:

浏览器:

GET http://devserver/services/myservice.asmx?WSDL HTTP/1.1 
Accept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/vnd.ms-powerpoint, application/vnd.ms-excel, application/msword, application/xaml+xml, application/vnd.ms-xpsdocument, application/x-ms-xbap, application/x-ms-application, application/x-shockwave-flash, */* 
Accept-Language: en-us 
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.0.3705; .NET CLR 2.0.50727; .NET CLR 1.1.4322; .NET CLR 3.0.04506.30; .NET CLR 3.0.04506.648; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C; .NET4.0E) 
Accept-Encoding: gzip, deflate 
Connection: Keep-Alive 
Host: devserver 
Cookie: SIFR-PREFETCHED=true 

的SOAPClient(从VB6应用程序):

GET http://devserver/services/myservice.asmx?WSDL HTTP/1.1 
Accept: */* 
Accept-Encoding: gzip, deflate 
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.0.3705; .NET CLR 2.0.50727; .NET CLR 1.1.4322; .NET CLR 3.0.04506.30; .NET CLR 3.0.04506.648; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C; .NET4.0E) 
Host: hbhswebnet 
Connection: Keep-Alive 
Pragma: no-cache 

我不知道,如果这些信息是有帮助的,但也许它是。

+0

你认为这可能是一个权限错误? Web01上的VB6应用程序可能没有权限进行SOAPClient调用。 – 2010-07-30 19:07:31

+0

我不认为这是一个编程问题;它属于ServerFault – 2010-07-30 19:12:56

+0

您是否正在通过Web代理访问远程计算机? – 2010-07-30 19:28:30

回答

3

这里有一个通用的模式:

问:“X”工程在浏览器,但在在做浏览器做同样的事情的程序失败。怎么了?

A:该程序是而不是做浏览器正在做同样的事情。

浏览器明确设置程序未设置的标题(尤其是因为您使用的是非常过时的SOAPClient)。各种网络设备和软件可能会在决定如何响应您的请求时查看这些标题。

您应该使用Fiddler或其他东西来查看这两种情况(浏览器和程序)的网络流量,然后仔细查看浏览器行为方式和程序行为方式之间的差异。然后,您可以将程序更改为浏览器,或者请求网络人员请降低安全性,以便您的程序可以访问该服务。

+0

这是伟大的建议,尤其是。使用Fiddler的想法。我没有想过要这样做来检查请求头。我猜最让我吃惊的是它在一台机器上工作*,而不是真正负责拨打电话的机器。 – 2010-07-30 19:43:41

+0

@Ben:根据您发布的标题,我会问网络人员有关SIFR-PREFETCHED = true cookie的信息。 – 2010-07-30 19:53:31

0

另一个需要关注的问题是浏览器中的代理设置,你是否要通过代理? VB6从Internet Explorer中获取一些但不是全部的代理设置,但没有从任何其他浏览器获取。

如果Fiddler不起作用,您可能需要卷起你的小辫并挖掘到Wireshark,以了解VB6为什么不通信。

另一个需要注意的重要问题是,您使用的是SOAP客户端? (微软过时的和有问题的客户端,PocketSOAP,家里酿造的东西?)一个建议可能是为.Net写一个soap代理,然后使用interop来处理你的肥皂。

0

“WSDLReader错误”80020009' WSDLReader:XML分析器在布线0,线路位置0时失败,原因是:服务器名称或地址无法解析HRESULT = 0x1:函数不正确 - WSDLReader:加载WSDL文件失败HRESULT = 0x80070057:参数不正确 - 客户端:提供的参数之一是无效的HRESULT = 0x80070057:参数不正确“

Windows Update损坏的注册表和Web应用程序不会启动任何与您的网站相关的对象服务,你会得到这个错误。 尝试重新注册SOAP客户端和SOAP Dll或尝试重新安装它们。

+0

您是否阅读过接受的答案? – 2012-10-19 21:33:10

0

WSDL文件和/或服务本身可能需要身份验证。在我的情况下(假设基本身份验证),我必须提供凭证到SOAP连接URL,因此:

http://www.mydomain.com/services/myservice.asmx?WSDL 

变为:

http://user:[email protected]/services/myservice.asmx?WSDL 

当然,这是在公共互联网上完全没有安全感,所以你应该使用HTTPS。如果可能,您还应该将连接限制在可信主机上。

这可能会或可能不会与某些安全更新工作,你的浏览器或MSXML:

https://support.microsoft.com/default.aspx?scid=kb;en-us;832414

在这种情况下,您可能需要提供使用其他方法的凭据。如果你能得到的WSDL文件没有凭据访问,你仍然可以确保与证书服务,并通过他们在SOAP信封:

sc.ssoapinit(WSDLURL) 
    sc.ConnectorProperty("AuthUser") = "user" 
    sc.ConnectorProperty("AuthPassword") = "password" 
0

有同样的问题。代码将在我的机器上工作,但不在客户端上。必须加载IE-Tools-Internet选项并点击高级。向下滚动到安全性并取消选中“不要将加密的页面保存到磁盘”。

相关问题