首页 > 解决方案 > C# SoapHttpClientProtocol - 设置本地绑定地址(源地址)

问题描述

我正在尝试对业务合作伙伴托管的 Web 服务进行 Soap 调用。我遇到的问题是我们的客户端托管在具有多个 IP 的虚拟 PC 上。我想用不同的(非默认)IP 地址调用托管的 Web 服务。这是为什么?我们的客户端应用程序和托管 Web 服务之间存在 VPN 连接,但它是在两个 IP 之间设置 LAN2LAN。现在我必须更改本地源 IP 地址以匹配 VPN 要求。

我曾尝试使用 SoapHttpClientProtocol 的 WebProxy,将其值设置为新 IP,但它似乎不起作用。我收到 HTTP 404 错误。

这是一些代码:

//soapApiClient is typeof SoapHttpClientProtocol
//endpoint url -> webservice, url from appSettings
var url = SettingsProvider.ClientSapGetUserDataUrl;
soapApiClient.Url = url;

//proxy settings -> setting new IP, defined in appSettings
var proxy = SettingsProvider.ClientProxyAddress;
soapApiClient.Proxy = new WebProxy(proxy);

//credentials
soapApiClient.Credentials = GetCredentials();

我 HTTP 发布用户代码和返回值应该是来自 SAP 的用户数据,目前我收到 404 http 错误代码。相比之下,它就像来自 SoapUI 的魅力。也许设置代理不是我想要的?任何帮助将非常感激。

编辑:为了更清楚目前,默认情况下从默认 ip 91.185.201.88 调用服务。服务的 IP 是 10.67.145.70。我想这样改变它:从 192.168.4.2 调用服务到服务的 10.67.145.70。

标签: c#urlsoapsoaphttpclientprotocol

解决方案


我终于设法使它工作。如果其他人对此有疑问,请按照这些说明进行操作。

  • 在调用远程服务之前,您必须为其找到服务点。这是通过 ServicePointManager 完成的

例子:

var servicePointUserReader = ServicePointManager.FindServicePoint(new Uri(FULLY QUALIFIED REMOTE SERVICE URL));  
servicePointUserReader.BindIPEndPointDelegate = (sp, remote, retryCount) => new IPEndPoint(IPAddress.Parse(SOURCE IP FROM WHICH YOU WANT TO SEND REQUEST), 0); 

在我的示例中,完全限定的远程服务 url 类似于http://65.145.63.71:8010/sapService(这是我们试图调用的)。然后我想从我们的虚拟 PC 上的不同 IP 拨打电话,该虚拟 PC 有许多 IP 地址。您只需输入所需的 IP,如代码第二行所示,例如 192.168.5.1。

确保在使用 new Uri() 构造函数调用 FindServicePoint 时使用“http://”,否则它将不起作用!

之后,只需继续调用服务即可。两行代码,这就是你所需要的。:)


推荐阅读