快速概述我在这里得到的东西:
WCF Soap 服务通过 HTTPS 运行,消息凭证类型为证书。我有 2 个我使用的端点(除了 mex),1 个用于我的正常服务调用,另一个用于流文件。这是我的服务的 web.config(编辑了一些项目名称):
<bindings>
<wsHttpBinding>
<binding name="wsHttpEndpointBinding">
<security mode="TransportWithMessageCredential">
<message clientCredentialType="Certificate" />
</security>
</binding>
</wsHttpBinding>
<basicHttpBinding>
<binding name="streamBinding" transferMode="Streamed" messageEncoding="Mtom" maxReceivedMessageSize="2147483646">
<security mode="TransportWithMessageCredential">
<message clientCredentialType="Certificate" />
</security>
</binding>
</basicHttpBinding>
</bindings>
<services>
<service behaviorConfiguration="Services.Behavior" name="MyInterface">
<endpoint address="" binding="wsHttpBinding" bindingConfiguration="wsHttpEndpointBinding" name="wsHttpEndpoint" contract="IMyInterface" />
<endpoint address="stream" binding="basicHttpBinding" bindingConfiguration="streamBinding" name="streamEndpoint" contract="IMyInterface" />
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="Service.Behavior">
<serviceMetadata httpGetEnabled="false" httpsGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
<dataContractSerializer maxItemsInObjectGraph="2147483646" />
<serviceCredentials>
<serviceCertificate findValue="CN=Server.Temp.Dev" />
</serviceCredentials>
</behavior>
</serviceBehaviors>
</behaviors>
该服务有一个我正在测试的方法 DownloadDocument。这是签名:
DocumentDownloadResponse 下载文档(DocumentDownloadRequest 请求);
值得注意的是,当传入的数据无效时,服务会抛出异常,DownloadDocument 会捕获这些异常并在响应对象中传回错误消息。
DocumentDownloadRequest 如下所示:
[MessageContract]
public class DocumentDownloadRequest
{
[MessageHeader]
public string SecurityToken { get; set; }
[MessageHeader]
public string LoginName { get; set; }
[MessageHeader]
public string DocumentId { get; set; }
}
并下载文档响应:
[MessageContract]
public class DocumentDownloadResponse : ServiceResponse<Stream>
{
public DocumentDownloadResponse()
{
Data = Stream.Null;
}
[MessageHeader(MustUnderstand = true)]
public bool Success { get; set; }
[MessageHeader(MustUnderstand = true)]
public string ErrorMessage { get; set; }
[MessageBodyMember(Order = 1)]
public Stream Data { get; set; }
}
这是我从客户端调用它的方式:
var soapServiceClient = new SoapServiceClient("streamEndpoint");
bool success;
Stream stream;
string errorMessage =
soapServiceClient.DownloadDocument(documentId, loginName, securityToken, out success, out stream);
serviceClient.Close();
其中 SecurityToken 和 LoginName 是需要验证的项目。奇怪的是,在我的测试客户端中,当我使用有效数据调用 DownloadDocument 时,我能够完美地下载文件任意多次。但是,如果我传入无效的 LoginName 或 SecurityToken,我会收到指示数据不正确的错误消息(如预期的那样)。但是,如果我传入 3 次无效数据,客户端就会超时。在本地运行服务我没有遇到这个问题,一切都按预期运行。奇怪的是,当我打开提琴手运行时,我没有遇到这个问题。当我在我的开发服务器上运行该服务时,我遇到了问题。
开发服务器上的配置与我在本地运行的配置相匹配。使用 SvcTraceTool 我没有看到任何错误,只是它只记录了前 2 个成功的调用,而不是失败的那个。它几乎让我觉得端点只是以某种方式关闭了自己。
悬崖:
1) 具有 2 个端点的服务,其中一个是流式传输(我关心的那个)。2) 能够使用流式端点调用方法来下载具有有效数据的文件 3) 服务正确捕获坏数据 2 次,第 3 次挂起。SvcTraceTool 中没有日志,客户端超时。
有任何想法吗?
谢谢