无法建立与基于 SOAP 的服务的连接

Posted

技术标签:

【中文标题】无法建立与基于 SOAP 的服务的连接【英文标题】:Unable to establish connection to a SOAP based service 【发布时间】:2021-02-06 19:52:07 【问题描述】:

我正在尝试设置对安全 HTTPS 端点的调用,并使用下面的代码建立基于 SOAP 的通信。我使用 Visual Studio 和服务的 WSDL 创建了一个 Web 服务引用。

//NetHttpsBinding binding = new NetHttpsBinding();
NetHttpsBinding binding = new NetHttpsBinding();

string url = "https://" + ...;
EndpointAddress address = new EndpointAddress(url);
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
//CustomClient client = new CustomClient();
CustomClient client = new CustomClient(binding, address);
client.ClientCredentials.UserName.UserName = "monkey";
client.ClientCredentials.UserName.Password = "donkey";

FindUsersByUserIdRequest request = new FindUsersByUserIdRequest

  applicationId = "kaweb",
  searchMatchMode = "EXACT",
  soughtUserId = "197002150485"
;

FindUsersByUserIdResponse response = client.FindUsersByUserId(request);
User[] result = response.users;

计算机不喜欢它并告诉我这样的事情,并指定了 401。 (一些东西,因为它是一种我们不懂的奇怪语言。是的,地狱有一个特殊的角落专门为那些不会在编码中使用英语的人提供,因为它是 哦,天哪,更容易理解。)

System.ServiceModel.Security.MessageSecurityException: 根据客户端模式匿名,未批准 Http 请求。来自服务器的授权标头是 Basic realm="CT"。

当我检查available bindings 时,我发现我应该使用NetHttpsBinding(因为我们使用 URL 中所述的 HTTPS)。认证方式建议here,我尝试大致遵循this approach。

这样的端点可以工作并产生正确的值,我使用 SoapUI 和具有相同凭据集的基本身份验证来验证这些值。此外,根据一般提示,其他人声称能够获取信息(尽管我怀疑当时有基于 Java 的客户端)。

我尝试在谷歌上搜索如何指定身份验证架构,但未能找到相关信息(或者因为太无知而无法识别它何时存在)。根据this suggestion,我应该操纵请求中的标头。我似乎无法在 FindUsersByUserIdRequest 对象中访问该字段(并且覆盖它似乎是个坏主意,因为它是自动生成的,我无法控制它。

我该怎么做和/或如何进一步排除故障?

【问题讨论】:

当您使用 https 并且在发送请求之前使用 TLS 完成身份验证时。您作为默认使用的 TLS 版本可能不起作用。您不能使用 TLS 1.0/1.1,必须使用 TLS 1.2/1.3。请参阅以下内容:***.com/questions/64375532/… @jdweng 感谢您的提示。当您说可能不起作用时,这听起来像是几个可能的问题中的一个。有什么方法可以验证/排除它吗? 旧版本的内核(手机)、操作系统、网络可能不支持 TLS 1.2/1.3。并且 TLS 1.2/1.3 可能不支持证书加密模式。请参阅:en.wikipedia.org/wiki/Transport_Layer_Security. @jdweng 遗憾的是,我似乎没有成功。我按照链接问题中的建议使用了ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;,将其放置在客户端实例化之前,如此处更新的问题所示。我没有使用HttpClient,而是使用System.ServiceModel.ClientBase<T> 从Web 服务中提供的WSDL 自动生成。不过,这应该没关系,对吧?对于如何解决此问题,您还有其他建议吗? 另请查看:***.com/a/1712795/5311735 【参考方案1】:

看起来(通过一些搜索此错误)您缺少一种指定必须为请求执行的“领域”的方法。您似乎可以在 app-config.xml

中进行设置

eg1:

<basicHttpBinding>
   ...  
     <security mode="TransportCredentialOnly">
        <message clientCredentialType="UserName" algorithmSuite="Default"/>
        <transport clientCredentialType="Ntlm" proxyCredentialType ="Ntlm" realm="CT"/>
      </security>
    </binding>
   </basicHttpBinding>
   ...

eg2:

 <security mode="Transport">
   <transport clientCredentialType="Basic" proxyCredentialType="Basic" realm="CT">
      <extendedProtectionPolicy policyEnforcement="Never" />
   </transport>
   <message clientCredentialType="UserName" algorithmSuite="Default" />
 </security>

eg3:

<security mode="Transport">
   <transport clientCredentialType="Basic" proxyCredentialType="Basic" realm="CT" />
</security>

虽然公认有点“有根据的猜测”,但请告诉我们这是否可行,如果不可行,我可以指出一些可能相关的答案。

【讨论】:

其他人已经打败了你,但他是我们组织的本地人,所以他有不公平的优势。也就是说,问题仍然是没有得到数据但是现在已经建立了连接,如果他没有发光,你的输入将是救星。所以你得到了赏金,除非在我被允许奖励之前发生了一些不寻常的事情。也感觉敦促在一两天内提醒我。你应得的。

以上是关于无法建立与基于 SOAP 的服务的连接的主要内容,如果未能解决你的问题,请参考以下文章

使用 paypal api 时无法建立 SOAP 连接

如何将Boondmanager ERP的PHP中的SOAP API与Talend连接起来

Android 和 SAP SOAP Web 服务之间的连接建立

ftp无法与服务器建立连接

WebSocket无法建立到服务器的连接?

连接google账户一直都是“无法与服务器建立稳定的数据连接”。怎么办?