本主题回答关于 .NET WCF SOAP 客户端的常见问题。

章节目录:

什么是绑定?

在 WCF 中,绑定描述 web 服务端点的传输、安全和消息编码。SOAP 客户端需要知道端点的绑定,以便与端点通信。SOAP 客户端可以从 WSDL 文档或 .NET WCF 客户端配置文件自动确定端点的绑定。

如何创建 .NET WCF 客户端配置文件?

Microsoft 服务模型元数据工具(svcutil.exe)可以根据服务 WSDL 文档的 URL 生成客户端配置文件。Microsoft 服务配置编辑器可用于使用图形用户界面创建和编辑 WCF 配置文件。这两个工具都是 Microsoft Windows SDK 的一部分,它包含在 Visual Studio 中,也可以从 Microsoft 下载。Web 服务的开发人员还可以为您正在测试的 web 服务提供客户端配置文件。

我必须使用 .NET WCF 客户端配置文件吗?

不是必须的。如果 web 服务的 WSDL 文档充分描述了 web 服务,那么 SOAP 客户端只需要约束到该 WSDL,而不需要使用客户端配置文件。但是,如果 web 服务使用基于证书的身份验证,则必须设置一个 .NET WCF 客户端配置文件,该文件描述安装在本地计算机上的证书的位置。WCF 绑定还定义了各种限制,包括对最大接收消息大小的限制。可以在 .NET 客户端配置文件中控制这些限制。

如何配置基于证书的身份验证?

首先,您需要使用 Windows 证书管理器安装任何客户端和服务器证书。前往 Start> Run...,输入 "certmgr.msc",然后点击 OK 打开 Windows 证书管理器。通常,您将在受信任人库中安装服务器证书,并在个人库中安装客户端证书。接下来,必须在客户端配置文件中指定这些证书的位置。 

MSDN 网站有关于如何做到这一点的详细信息,包括配置文件示例:

可以使用 .NET WCF SOAP 客户端来测试旧的 .NET web 服务吗?

只适用于 WSE 3.0。.NET WCF 客户端在网络传输层面与 WSE 3.0 服务兼容。以下自定义绑定可用于使用 Secure Conversation 和 MutualCertificate11 测试 WSE 3.0 web 服务:

<binding name="SecureConversationMutualCertificate11SignEncryptConfig">
    <security authenticationMode="SecureConversation" messageProtectionOrder=
         "SignBeforeEncrypt" requireSecurityContextCancellation="false">
         <secureConversationBootstrap authenticationMode="MutualCertificate"
               securityHeaderLayout="Strict" messageProtectionOrder="SignBeforeEncrypt"
               requireSignatureConfirmation="true" />
    </security>
    <textMessageEncoding messageVersion="Soap11WSAddressingAugust2004" />
    <httpTransport />
</binding>

MSDN网站有更多细节,请参阅 http://msdn2.microsoft.com/en-us/library/ms730299.aspx

我可以使用 .NET WCF SOAP 客户端来测试基于 Glassfish Metro/WSIT 的服务吗?

当然可以!Metro WSIT 服务与 .NET WCF 客户端(包括 SOAtest 的 SOAP 客户端工具)具有互操作性。然而,Metro 中有一个已知的 bug,其中空格和换行会导致请求消息的安全性验证失败。这个问题可以通过将扩展工具链接到 SOAP 客户端测试的请求 SOAP 信封输出来避免,该输出用于删除额外的空格:

from com.parasoft.api import * 
from java.lang import *
 
def removeAllNewLineCharacters(input, context):
    noNewLines = str(input).replace("\r", "").replace("\n", "")
    result = String(noNewLines).replaceAll(">\s*<", "><")
    Application.showMessage(result) # for debugging
    return result

常见错误

错误消息解决方案
无法在客户端配置文件中找到端点如果您的 SOAP 客户端测试使用 .NET WCF 客户端配置文件,而该文件没有描述为您的测试配置的端点,则会发生此测试失败。验证客户端配置文件是否描述了与测试相同的端点。检查端点 URL 中每个字符的大小写(区分大小写)。还要验证您的测试是否使用了有效的 .NET WCF 客户端配置文件。服务配置文件(web.config)或 WSE 配置文件将不起作用。
无法在 WSDL 中找到端点如果您的 SOAP 客户端测试受 WSDL 约束,而该文件没有描述为您的测试配置的端点,则会发生此测试失败。您可能需要更正测试中的端点,以匹配 WSDL 文档中的端点。如果 WSDL 文档中的端点不正确,那么应该纠正 WSDL。如果无法纠正 WSDL,则应配置测试,使用描述正确端点的 .NET WCF 客户端配置文件。
X.509 证书 Cn=localhost 链构建失败。使用的证书具有无法验证的信任链。替换证书或更改 certificateValidationMode。

测试失败表明,您可能需要在客户端配置文件中配置 certificateValidationMode 属性。通常,您可以使用 Windows 证书管理器将服务器的证书添加到受信任人库中,然后在配置文件中将 certificateValidationMode 属性设置为 PeerOrChainTrust。MSDN 网站有一个例子,请参阅 http://msdn.microsoft.com/en-us/library/ms587504.aspx  和  http://msdn.microsoft.com/en-us/library/system.servicemodel.security.x509certificatevalidationmode.aspx

发送邮件的身份检查失败。远程端点的预期 DNS 标识是‘host1’,但是远程端点提供了 DNS clam‘host2’。如果这是一个合法的远程端点,那么在创建通道代理时,可以通过显式地将 DNS 标识‘host2’指定为 EndpointAddress 的标识属性来解决这个问题。

WSDL 中端点的 DNS 标识可能不正确。测试失败表明,您可能需要在客户端配置文件中明确地配置 Identity 属性。还需要从 WSDL 取消对测试的约束,以防止 WSDL 中的端点信息优先于配置文件中的端点信息。

请参阅在客户端指定标识:http://msdn.microsoft.com/en-us/library/ms733130.aspx

已超过传入消息的最大消息大小配额(65536)。若要增加配额,请在适当的绑定元素上使用 MaxReceivedMessageSize 属性。

测试失败表明,您需要在客户端配置文件中配置 MaxReceivedMessageSize 属性。MSDN 网站有一个例子,请参阅 http://msdn.microsoft.com/en-us/library/system.servicemodel.basichttpbinding.maxreceivedmessagesize.aspx

已经超过了最大读取深度(32),因为正在读取的 XML 数据的嵌套级别超过了配额所允许的级别。可以通过更改创建 XML 阅读器时使用的 XmlDictionaryReaderQuotas 对象上的 MaxDepth 属性来增加这个配额。

测试失败表明,您需要在客户端配置文件中配置 MaxDepth 属性。MSDN 网站有一个例子,请参阅 http://msdn.microsoft.com/en-us/library/system.servicemodel.basichttpbinding.readerquotas.aspx

加载测试 .NET WCF SOAP 客户端时出现“内存不足”错误。您可能需要减小 Java 堆的大小,以便 .NET 运行时可以为 .NET 堆分配更多内存。
未被认可的消息版本此错误涉及正在发送的消息的 SOAP 和 WS-Addressing 的版本。  如果传出的消息不是有效的 SOAP 消息封套,则可能发生此测试失败。  如果 SOAP 客户端的请求选项卡使用字面量 XML 或表单 XML 视图,那么请验证 XML 中是否存在 SOAP 消息封套。
  • No labels