为什么我可以从浏览器访问WSDL文件,而不是从应用程序访问?

时间:2010-07-30 19:03:52

标签: .net web-services vb6 asmx

我们在部署在我们的开发环境中工作但不在生产环境中的Web服务时遇到了问题。部分问题是我们的生产服务器是负载均衡的,因此要升级其中一个服务器,我们必须将其从负载平衡中取出并尝试单独测试服务器,这是一个挑战。

我正在处理的计算机名为Web01,而我用来测试的计算机称为Ts01。在这两台计算机上,我修改了hosts文件,将mydomain.com重定向到Web01上网站的approrpiate IP。

我正在测试在每台计算机上访问Web服务的两种方式:

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

以下是测试结果:

                   Browser              VB6 App
    Ts01             OK                   OK
    Web01            OK                  ERROR

对于除Web服务器上安装的VB6应用程序之外的所有情况,测试似乎都可以正常运行。我得到的错误是:

  

-2147024809 - WSDLReader:加载WSDL文件失败HRESULT = 0x80070057 - WSDLReader:XML解析器在linenumber 0,行位置0失败,原因是:系统找不到指定的对象。

     

HRESULT =为0x1

如果我在VB6应用程序中提供错误的WSDL地址,我会在Ts01上收到相同的错误。似乎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 App):

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

我不确定这些信息是否有用,但也许是。

5 个答案:

答案 0 :(得分:3)

这是一般模式:

  

问:“ x ”在浏览器中有效,但在浏览器正在执行相同操作的程序中失败。怎么了?

     

答:程序做与浏览器相同的事情。

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

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

答案 1 :(得分:0)

另一件需要注意的是浏览器中的代理设置,您是通过代理吗? VB6从Internet Explorer中获取了一些但不是全部的代理设置,但没有从任何其他浏览器获取。

如果Fiddler不起作用,你可能需要卷起你的样子并深入研究Wireshark,找出为什么VB6没有通信。

另一个重要的事情是,您使用的是什么SOAP客户端? (微软过时和有缺陷的客户,PocketSOAP,家庭酿造的东西?)一个建议可能是为.Net写一个soap代理,然后使用互操作来处理你的肥皂。

答案 2 :(得分:0)

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

Windows Update损坏的注册表和Web应用程序不会启动与您的Web服务相关的任何对象,并且您是否会收到此错误。 尝试重新注册SOAP客户端和SOAP Dll,或尝试重新安装它们。

答案 3 :(得分:0)

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

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

变为:

http://user:password@www.mydomain.com/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"  

答案 4 :(得分:0)

有同样的问题。代码可以在我的机器上运行,但不适用于客户端。必须加载IE-Tools-Internet Options并单击Advanced。向下滚动到安全性并取消选中“不将加密的页面保存到磁盘”。