wcf client - 偶发错误接收响应

时间:2018-06-06 03:26:54

标签: c# wcf-binding wcf-security

我有一个奇怪的问题,我无法深入了解问题。我希望SO的某个人可以给我一些建议

我们有一个wcf客户端使用自定义绑定调用我们无法控制的服务

几个月前,我们开始收到以下错误

  

收到对此的HTTP响应时发生错误   server url)这可能是由于服务端点绑定没有   使用HTTP协议。这也可能是由HTTP请求引起的   上下文被服务器中止(可能是由于服务   关闭)。有关详细信息,请参阅服务器日志。

对服务提供商说,他们说他们可以看到离开系统的消息,消息是正确的。就他们而言,这是我们的一个问题。

谷歌告诉我,问题通常是由于服务器端的延迟加载属性的序列化,但服务提供商告诉我这不是问题。

  • 问题在服务端升级后直接启动
  • 我们收到大约5%的通话错误。我们最多运行20个线程 经常打电话给服务,所以有很多电话,但我 可以用单个线程复制问题
  • 我们不会在周末或公众假期收到错误。我们的数量在这些日子里没有什么不同,但它们可能适用于服务
  • 我添加了一个带有消息检查器的端点行为,以记录我们的请求和响应的原始消息。当我们收到错误时,没有创建响应消息文件
  • 我添加了系统诊断跟踪,可以看到 通过频道发送的消息然后有一个例外 接收带有堆栈跟踪的消息,通向“现有” 连接被远程主机'
  • 强行关闭
  • 当我跑小提琴时 为了尝试捕获消息,错误从未发生过,所以我 猜fiddler正在对允许它的消息做些什么 接受
  • 当我运行wireshark(非解密消息)时,它突出显示 seq / ack分析并给出“警告”的严重程度,即“此警告” frame是(疑似)无序段'

有没有人对我接下来要尝试的内容有任何建议?

客户端自定义绑定代码如下所示,以防为某人提供任何帮助。

private static Binding GetCustomBinding()
{
    CustomBinding myBinding = new CustomBinding();

    AsymmetricSecurityBindingElement asbe = new AsymmetricSecurityBindingElement();
    asbe.MessageSecurityVersion = MessageSecurityVersion.WSSecurity11WSTrust13WSSecureConversation13WSSecurityPolicy12;
    asbe.InitiatorTokenParameters = new X509SecurityTokenParameters { InclusionMode = SecurityTokenInclusionMode.Never };
    asbe.RecipientTokenParameters = new X509SecurityTokenParameters { InclusionMode = SecurityTokenInclusionMode.Never };
    asbe.MessageProtectionOrder = MessageProtectionOrder.SignBeforeEncrypt;
    asbe.SecurityHeaderLayout = SecurityHeaderLayout.Strict;
    asbe.EnableUnsecuredResponse = true;
    asbe.IncludeTimestamp = false;
    asbe.SetKeyDerivation(false);

    asbe.DefaultAlgorithmSuite = SecurityAlgorithmSuite.Basic128Rsa15;

    asbe.EndpointSupportingTokenParameters.Signed.Add(new UserNameSecurityTokenParameters());
    asbe.EndpointSupportingTokenParameters.Signed.Add(new X509SecurityTokenParameters());
    myBinding.Elements.Add(asbe);

    TextMessageEncodingBindingElement element = new TextMessageEncodingBindingElement(MessageVersion.Soap11, Encoding.UTF8);
    element.ReaderQuotas.MaxStringContentLength = int.MaxValue;

    element.ReaderQuotas.MaxDepth = 1000;
    element.ReaderQuotas.MaxArrayLength = 1000;
    myBinding.Elements.Add(element);

    HttpsTransportBindingElement httpsBindingElement = new HttpsTransportBindingElement();
    httpsBindingElement.AuthenticationScheme = System.Net.AuthenticationSchemes.Basic;
    httpsBindingElement.KeepAliveEnabled = false;
    httpsBindingElement.RequireClientCertificate = true;
    myBinding.Elements.Add(httpsBindingElement);


    httpsBindingElement.MaxReceivedMessageSize = int.MaxValue;
    httpsBindingElement.MaxBufferSize = int.MaxValue;

    return myBinding;
}

为你提供的任何帮助干杯,我已经没有想法了。

史蒂夫

0 个答案:

没有答案