私はwcf Webサービスからデータを取得していますが、データが20万件を超えるレコードの場合、次のような例外が発生します:
System.ServiceModel.CommunicationException: The underlying connection was closed: A connection that was expected to be kept alive was closed by the server. ---> System.Net.WebException: The underlying connection was closed: A connection that was expected to be kept alive was closed by the server. ---> System.IO.IOException: Unable to read data from the transport connection: An existing connection was forcibly closed by the remote Host. ---> System.Net.Sockets.SocketException: An existing connection was forcibly closed by the remote Host
at System.Net.Sockets.Socket.Receive(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags)
at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)
--- End of inner exception stack trace ---
at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)
at System.Net.PooledStream.Read(Byte[] buffer, Int32 offset, Int32 size)
at System.Net.Connection.SyncRead(HttpWebRequest request, Boolean userRetrievedStream, Boolean probeRead)
--- End of inner exception stack trace ---
at System.Net.HttpWebRequest.GetResponse()
at System.ServiceModel.Channels.HttpChannelFactory`1.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout)
--- End of inner exception stack trace ---
Server stack trace:
at System.ServiceModel.Channels.HttpChannelUtilities.ProcessGetResponseWebException(WebException webException, HttpWebRequest request, HttpAbortReason abortReason)
at System.ServiceModel.Channels.HttpChannelFactory`1.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout)
at System.ServiceModel.Channels.RequestChannel.Request(Message message, TimeSpan timeout)
at System.ServiceModel.Dispatcher.RequestChannelBinder.Request(Message message, TimeSpan timeout)
at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation)
at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(iMessage message)
私のweb.configは次のようになります:
<basicHttpBinding>
<binding name="BasicHttpBinding_IService" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
maxBufferSize="2147483647" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647"
allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
messageEncoding="Text" textEncoding="utf-8" transferMode="StreamedResponse" useDefaultWebProxy="true">
<readerQuotas maxDepth="32" maxStringContentLength="2147483647" maxArrayLength="2147483647"
maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
<security mode="None">
<transport clientCredentialType="None" proxyCredentialType="None" realm="" />
<message clientCredentialType="UserName" algorithmSuite="Default" />
</security>
</binding>
<binding maxReceivedMessageSize="2147483647" allowCookies="true">
<readerQuotas maxDepth="32" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647"
maxNameTableCharCount="2147483647" />
</binding>
</basicHttpBinding>
私のWebサービスはDBからデータを取得していると確信しています。通話を開始した場所からウェブに転送できません。助けてくれてありがとう。
最近、.Net 4.0 Webアプリ内のWcfサービスで同じ問題が発生しました。 maxItemsInObjectGraphの値を増やしたところ、サーバーは例外をスローしなくなりました。ドキュメント here では、デフォルトの最大値はInt32.MaxValueですが、間違っていると思います。最大値は65535です。
<serviceBehaviors>
<behavior name="ServiceBehaviour">
<dataContractSerializer maxItemsInObjectGraph="6553500"/>
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
</serviceBehaviors>
他にできることは、トレースを有効にすることです。これは、web.configにあるものの例です。
<system.diagnostics>
<sources>
<source name="System.ServiceModel"
switchValue="Information, ActivityTracing"
propagateActivity="true">
<listeners>
<add name="traceListener"
type="System.Diagnostics.XmlWriterTraceListener"
initializeData= "c:\temp\log\Traces.svclog" />
</listeners>
</source>
</sources>
</system.diagnostics>
Traces.svclogをダブルクリックすると、WindowsがMicrosoft Service Trace Viewerを開くはずです。
Microsoft WCFテストクライアントでサービスをテストする場合は、サーバー設定(クライアントエンドポイントの動作を含む)に一致するように既定のクライアント構成を変更し、クライアントがサーバーから応答を受信できることを確認してください。
これがお役に立てば幸いです。
クライアントのbasicHttpBindingをサーバーバインディングと同じにします。これは、サーバーとクライアントのバインディングではなく、1つのバインディングのみを変更する非常に一般的なエラーです。
それがうまくいかない場合は、wcfトレースを有効にできます。 wcfトレース
それにより、根本的な問題が何であるかについてより多くの洞察が得られます。
オブジェクトグラフに戻りのループがありました。これはおそらくあなたの問題ではないことを知っていますが、他の誰かが同じ問題を抱えている場合のためにここに追加しています。 includeExceptionDetailInFaultsを有効にしましたが、どのクライアント(アプリケーションまたはWCFテストクライアント)でもエラーが発生していませんでした。幸いなことに、サーバーログに表示されたため、そのように見つけることができました。
双方向ナビゲーションには親->子および子->親があり、そのリンクを解除して代わりに親->子を持たなければならず、子は親をルックアップするためのIDを持っていたので、エラーはなくなりました。
これが誰かを助けることを願っています!
このステートメントは私の問題を解決しました:
db.ContextConfiguration.ProxyCreationEnabled = false;
次の構成をwcfサービス構成に追加します。 c:\ log\Traces.svclogファイルを参照してください。私の例外は、
パラメーターをシリアル化しようとしたときにエラーが発生しました。InnerExceptionメッセージは 'Enum値' 0 'はタイプ' ThyCams2014.XrmBase.new_filingstatu 'に対して無効であり、シリアル化できません。型にDataContractAttribute属性エントリコードがある場合、必要な列挙値が存在し、EnumMemberAttribute属性でマークされていることを確認してください。詳細については、InnerExceptionを参照してください。
<configuration>
<system.diagnostics>
<sources>
<source name="System.ServiceModel"
switchValue="Information, ActivityTracing"
propagateActivity="true">
<listeners>
<add name="traceListener"
type="System.Diagnostics.XmlWriterTraceListener"
initializeData= "c:\log\Traces.svclog" />
</listeners>
</source>
</sources>
</system.diagnostics>
</configuration>