本主题回答关于 .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 客户端配置文件中控制这些限制。还需要从 WSDL 文档取消对 SOAP 客户端测试的约束,以防止 WSDL 中的绑定信息优先于配置文件中的绑定信息。

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

首先,您需要使用 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 客户端测试的 Request SOAP Envelope 输出来避免,该输出用于删除额外的空格:


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,那么应该从错误的 WSDL 取消对 SOAP 客户端测试的约束,然后将您的测试配置为使用描述正确端点的 .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 属性。还需要从 WSDL 取消对测试的约束,以防止 WSDL 中的绑定信息优先于配置文件中的绑定信息。MSDN 网站有一个例子,请查阅 http://msdn.microsoft.com/en-us/library/system.servicemodel.basichttpbinding.maxreceivedmessagesize.aspx 。

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

测试失败提示表明,您需要在客户端配置文件中配置 MaxDepth 属性。还需要从 WSDL 取消对测试的约束,以防止 WSDL 中的绑定信息优先于配置文件中的绑定信息。MSDN 网站有一个例子,请查阅 http://msdn.microsoft.com/en-us/library/system.servicemodel.basichttpbinding.readerquotas.aspx 。

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