代码之家  ›  专栏  ›  技术社区  ›  Ben McCormack

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

  •  2
  • Ben McCormack  · 技术社区  · 16 年前

    我们在部署在开发环境中工作但在生产环境中不工作的Web服务时遇到问题。部分问题是我们的生产服务器是负载平衡的,所以要升级其中一个服务器,我们必须将其从负载平衡中去掉,并尝试隔离测试服务器,这是一个挑战。

    我正在工作的计算机被称为 Web01 我用来测试的电脑叫 Ts01 . 在这两台机器上,我修改了主机文件以重定向 mydomain.com 到网站的相应IP Web01 .

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

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

    测试结果如下:

                       Browser              VB6 App
        Ts01             OK                   OK
        Web01            OK                  ERROR
    

    除了安装在Web服务器上的vb6应用程序外,该测试似乎在任何情况下都可以正常工作。我得到的错误是:

    -2147024809-wsdlreader:加载WSDL文件失败,hresult=0x80070057-wsdlreader:xml分析器在行号0、行位置0处失败,原因是:系统找不到指定的对象。

    HESREST 0x1

    我又犯了同样的错误 TS01 如果我在VB6应用程序中提供了一个错误的WSDL地址。似乎vb6应用程序 Web01 无法访问上的Web服务dll Web01 这是个大问题。

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

    为什么vb6应用程序无法通过 SOAP客户端 从Web服务存在的同一个框中运行时?


    我使用fiddler检查调用dev服务器的本地计算机上的请求头。以下是浏览器和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
    

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

    5 回复  |  直到 9 年前
        1
  •  3
  •   John Saunders    16 年前

    这是一个一般模式:

    问: X “在浏览器中工作,但在执行与浏览器相同操作的程序中失败。发生了什么?

    A:程序是 不 做与浏览器相同的事情。

    浏览器明确地设置了程序没有设置的头(特别是因为您使用的是非常过时的soapclient)。在决定如何响应您的请求时,各种联网设备和软件可能会查看这些头文件。

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

        2
  •  0
  •   Kris Erickson    16 年前

    另一个需要注意的是浏览器中的代理设置,您是否正在访问代理?vb6从Internet Explorer获取了一些代理设置,但不是所有代理设置,但从任何其他浏览器中都没有。

    如果小提琴不起作用,你就得卷起袖子,钻进去。 Wireshark ,找出为什么vb6不能通信。

    另一个重要的问题是,您使用的是什么SOAP客户机?(微软过时的车载客户、Pockesoap、家庭自制的产品?)一个建议可能是编写一个.NET的SOAP代理,然后使用interop来处理SOAP。

        3
  •  0
  •   Harry    14 年前

    “wsdlreader错误'80020009' wsdlreader:xml分析器在行号0、行位置0处失败,原因是:无法解析服务器名称或地址,hresult=0x1:函数不正确。-wsdlreader:加载WSDL文件失败,hresult=0x80070057:参数不正确。-客户端:提供的参数之一无效。hresult=0x80070057:参数不正确。“

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

        4
  •  0
  •   Eric Lavitsky    12 年前

    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"  
    
        5
  •  0
  •   George Grennan    9 年前

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