【问题标题】:Calling a webservice from behind a proxy server从代理服务器后面调用 Web 服务
【发布时间】:2009-05-13 17:11:22
【问题描述】:

我需要在将使用 Web 服务(XML SOAP 服务)的应用程序 (C#) 中添加一个功能。

现在,此应用程序可以(并且大部分)用于拥有代理服务器的公司环境中。

我了解 SOAP 服务使用 HTTP 协议,因此应使用端口 80,该端口通常保持打开状态。应用程序可以在没有任何特殊编码的情况下使用 Web 服务是否正确,或者我需要编写特殊代码来检测代理设置或您看到的其他一些问题?

编辑:Webservice 是 Internet 上的公开可用服务。它不在同一个网络上。

【问题讨论】:

    标签: c# .net web-services soap


    【解决方案1】:

    默认情况下会使用 80 端口,您不必再进行任何编码。

    如果您确实需要通过某种代理,您只需将以下内容添加到您的 web.config:

      <system.net>
        <defaultProxy>
          <proxy  proxyaddress="http://yourproxyserver:80" />
        </defaultProxy>
      </system.net>
    

    您也可以使用以下代码通过代码来实现:

    WebRequest.DefaultWebProxy = new WebProxy("http://yourproxyserver:80/",true);
    

    【讨论】:

    • 但是如何传递凭据?
    • 如果要传递凭据,请使用以下代码: var proxy = new System.Net.WebProxy(proxyAddress, true); proxy.Credentials = new System.Net.NetworkCredential("username", "password"); System.Net.WebRequest.DefaultWebProxy = 代理;
    【解决方案2】:

    您可以使用本地机器的默认设置:

    System.Net.ServicePointManager.Expect100Continue = false; 
    wsclient.Proxy=  System.Net.HttpWebRequest.GetSystemWebProxy();
    wsclient.Proxy.Credentials = CredentialCache.DefaultCredentials;     
    

    并在 app.config 中添加此配置:

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <system.net>
        <settings>
          <servicePointManager expect100Continue="false" />
        </settings>
      </system.net>
    </configuration>
    

    【讨论】:

      【解决方案3】:

      好的。所以我做了一些实验,结果发现我们确实需要编写一些代码来让它在代理服务器后面工作。 (虽然我更喜欢更好的解决方案)

      所以它实际上是深入询问用户代理服务器的详细信息,然后为代理服务器配置服务代理类,如下所示:

      var networkCredentials = new NetworkCredential(“用户名”、“密码”、“域”); WebProxy myProxy = new WebProxy ("W.X.Y.Z:NN", true) {Credentials = networkCredentials}; var service = new iptocountry { Proxy = myProxy }; 字符串结果 = service.FindCountryAsString ("A.B.C.D");

      我写了一个测试类,它使用IP To Country免费网络服务。

      使用上面的代码,我可以成功使用网络服务。

      【讨论】:

      • 您无法在 配置元素中执行上述操作?
      • 我尝试使用代码(虽然不是配置文件)但它不起作用。实际上,我打算使用此服务的应用程序是 Windows 应用程序。不确定它是否重要。
      【解决方案4】:

      内置代码(WebClient、WCF、HttpWebRequest 等)都使用 WinHTTP 配置来获取代理配置。所以你需要做的就是配置 WinHTTP 来了解代理!

      在 XP 中,这是:

      proxycfg -u
      

      从用户的 IE 代理设置 (WinInet) 导入设置。

      在 Vista/etc 上,你使用

      netsh winhttp
      

      (以及一些像“import”这样的子命令)

      未经测试,但尝试:

      netsh winhttp import proxy source=ie
      

      之后,您的 .NET 代码应该全部通过用户可能已经配置的代理运行,以便使用 IE 等。

      【讨论】:

      • 上面可以通过代码做到吗?原因是需要访问 Web 服务的应用程序是一个 Windows 窗体应用程序,它可能在一系列计算机上运行。要求用户采取上述步骤是不可行的。
      【解决方案5】:

      如果您的 web 服务与调用 web 服务的客户端位于同一内部网络上,那么它不应该通过代理。

      【讨论】:

      • 没有。 Webservice 是 Internet 上的一种公开可用的服务。它不在同一个网络上。
      【解决方案6】:

      只要允许网络流量(端口 80)通过,您就不需要做任何特别的事情。从路由器/代理服务器的角度来看,Web 服务调用与任何其他 HTTP 流量相同。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多