2

私のサービスのapp.config

<system.serviceModel>
<client>
  <endpoint name="DataLocal" address="net.tcp://SomeAddress" binding="netTcpBinding" contract="ISomeContract" bindingConfiguration="TcpCustomSecurity" behaviorConfiguration="SecureBehaviorName">
    <identity>
      <dns value="localhost"/>
    </identity>
  </endpoint>
</client>
  <services>     
  <service name="SomeService">
    <host>
      <baseAddresses>
        <add baseAddress="http://SomeService" />
        <add baseAddress="net.tcp://SomeService" />
      </baseAddresses>
    </host>
    <endpoint name="SomeService_Normal" address="Secure" binding="netTcpBinding" contract="ISomeService" bindingConfiguration="TcpNormal"/>
  </service>
</services>
<bindings>
  <netTcpBinding>        
    <binding name="TcpNormal" transferMode="Buffered" receiveTimeout="24.20:31:23.6470000">
      <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647"/>
      <security mode="None" />
    </binding>
    <binding name="TcpCustomSecurity" transferMode="Buffered" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="24.20:31:23.6470000" sendTimeout="00:01:00" maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" maxBufferPoolSize="2147483647">
      <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647"/>
      <security mode="Message">
        <message clientCredentialType="UserName"/>
      </security>
    </binding>
  </netTcpBinding>   
</bindings>
<behaviors>
  <endpointBehaviors>
    <behavior name="SecureBehaviorName">
      <clientCredentials>
        <serviceCertificate>
          <authentication certificateValidationMode="None"/>
        </serviceCertificate>
      </clientCredentials>
      <dataContractSerializer maxItemsInObjectGraph="2147483647"/>
    </behavior>
  </endpointBehaviors>
</behaviors>

以下は、私が得ているエラーのスタックステートメントです。

>          System.dll!System.Net.Sockets.Socket.Send(byte[] buffer, int offset, int size, System.Net.Sockets.SocketFlags socketFlags) + 0x5a bytes 
        System.ServiceModel.dll!System.ServiceModel.Channels.SocketConnection.Write(byte[] buffer, int offset, int size, bool immediate, System.TimeSpan timeout) + 0xa7 bytes   
        System.ServiceModel.dll!System.ServiceModel.Channels.SocketConnection.Write(byte[] buffer, int offset, int size, bool immediate, System.TimeSpan timeout, System.ServiceModel.Channels.BufferManager bufferManager) + 0x34 bytes   
        System.ServiceModel.dll!System.ServiceModel.Channels.BufferedConnection.WriteNow(byte[] buffer, int offset, int size, System.TimeSpan timeout, System.ServiceModel.Channels.BufferManager bufferManager) + 0x90 bytes    
        System.ServiceModel.dll!System.ServiceModel.Channels.BufferedConnection.Write(byte[] buffer, int offset, int size, bool immediate, System.TimeSpan timeout, System.ServiceModel.Channels.BufferManager bufferManager) + 0x47 bytes 
         System.ServiceModel.dll!System.ServiceModel.Channels.FramingDuplexSessionChannel.OnSend(System.ServiceModel.Channels.Message message, System.TimeSpan timeout) + 0x115 bytes  
         System.ServiceModel.dll!System.ServiceModel.Channels.OutputChannel.Send(System.ServiceModel.Channels.Message message, System.TimeSpan timeout) + 0x81 bytes    
         System.ServiceModel.dll!System.ServiceModel.Dispatcher.DuplexChannelBinder.Request(System.ServiceModel.Channels.Message message, System.TimeSpan timeout) + 0x154 bytes  
        System.ServiceModel.dll!System.ServiceModel.Channels.ServiceChannel.Call(string action, bool oneway, System.ServiceModel.Dispatcher.ProxyOperationRuntime operation, object[] ins, object[] outs, System.TimeSpan timeout) + 0x206 bytes           
         System.ServiceModel.dll!System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(System.Runtime.Remoting.Messaging.IMethodCallMessage methodCall, System.ServiceModel.Dispatcher.ProxyOperationRuntime operation) + 0x59 bytes   
         System.ServiceModel.dll!System.ServiceModel.Channels.ServiceChannelProxy.Invoke(System.Runtime.Remoting.Messaging.IMessage message) + 0x65 bytes            
        mscorlib.dll!System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(ref System.Runtime.Remoting.Proxies.MessageData msgData, int type) + 0xee bytes  

//最初に上記のスタックのサービス呼び出し...

サービスの動作は次のとおりです:[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]

エラーは、数時間の継続的なテストの後に発生しました...デバッグ中に再現できません。

編集:

Dejanのおかげでトレース結果が得られました...

エラーが最初に発生すると、次のメッセージが表示されます。保留中の接続の最大数に達しました。

2回目の発生時に、次のメッセージが表示されます。システムがスロットル「MaxConcurrentConnections」に設定された制限に達しました。このスロットルの制限は200に設定されました。スロットル値は、サービススロットル要素の属性「maxConcurrentSessions」を変更することで変更できます。

したがって、2番目のメッセージではこれを行いました:

そして、このサービス動作をサービスに割り当てました。最初のメッセージのバインディングにmaxConnectionsを設定する必要がありますか?さらに、これが問題の根本的な原因であり、最初のメッセージまたは2番目のメッセージ、あるいはその両方です。後続のメッセージでは、常に2番目のメッセージが表示されるためです。

このようなシナリオを回避するために、app.configを更新するようにガイドしてください。

アップデート

トレース結果があります...

最初の発生時に、次のメッセージが表示されます。保留中の接続の最大数に達しました。

2回目の発生時に、次のメッセージが表示されます。システムがスロットル「MaxConcurrentConnections」に設定された制限に達しました。このスロットルの制限は200に設定されました。スロットル値は、サービススロットル要素の属性「maxConcurrentSessions」を変更することで変更できます。

したがって、2番目のメッセージではこれを行いました:

 <serviceBehaviors>
    <behavior name="tcpNormalBehavior">
      <serviceThrottling maxConcurrentSessions="800" maxConcurrentInstances="800" maxConcurrentCalls="200" />
      <dataContractSerializer maxItemsInObjectGraph="2147483647" />
    </behavior>
  </serviceBehaviors>

そして、このサービス動作をサービスに割り当てました。最初のメッセージのバインディングにmaxConnectionsを設定する必要がありますか?さらに、これが問題の根本的な原因であり、最初のメッセージまたは2番目のメッセージ、あるいはその両方です。後続のメッセージでは、常に2番目のメッセージが表示されるためです。

ご案内ください。

4

1 に答える 1

1

WCFサービスのどこかにスタックオーバーフローなどの未処理の例外がある可能性があります。正しく取得できれば、サービスは機能しますが、数時間後に機能しなくなります。

WCFサービスをデバッグするための最初のステップは、WCFトレースです。それを有効にして、サービスをテストしてみてください。サービスが再び機能しなくなった後、.svclogファイルにトレースエントリがあるはずです。

編集
更新された質問について:呼び出しが終了した後、クライアント側から接続を閉じていないため、その例外が発生します。WCFの呼び出しが次のようになるように、コードをリファクタリングしてみてください。

WCFProxy clientProxy = null;
try
{
    clientProxy = new WCFProxy();
    clientProxy.SomeCall();
    clientProxy.Close();
}
catch (Exception)
{
    if (clientProxy != null)
    {
        clientProxy.Abort();
    }
    throw;
}

次に、問題が発生するかどうかを確認します。

于 2012-05-30T09:00:56.273 に答える