System.ServiceModel.CommunicationException: базовое соединение было закрыто
Я извлекаю данные из веб-службы wcf, и когда данные составляют более 0,2 миллиона записей, я получаю исключение, которое находится по умолчанию:
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>
Я уверен, что мой веб-сервис извлекает данные из БД. но не может перейти на мой веб-сайт, с которого я инициировал вызов. Заранее благодарим за любую помощь.
Ответы
Ответ 1
Недавно у меня была та же проблема с сервисом Wcf в веб-приложении .NET 4.0. Я увеличил значение maxItemsInObjectGraph, и сервер больше не выдавал исключение. В документации здесь указано, что максимальный размер по умолчанию - 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, окна должны открыть Microsoft Trace Viewer.
Если вы тестируете свою службу с помощью тестового клиента Microsoft WCF, убедитесь, что вы изменили конфигурацию клиента по умолчанию, чтобы она соответствовала настройкам сервера (включая поведение конечной точки клиента), чтобы клиент мог получить ответ от сервера.
Надеюсь, это поможет.
Ответ 2
Сделайте свой клиент basicHttpBinding таким же, как привязка к серверу. Это обычная ошибка для изменения одной привязки вместо привязки к серверу и клиенту.
Если это не работает, вы можете включить трассировку wcf:
трассировка wcf
Это даст вам больше информации о том, что представляет собой проблема недооценки.
Ответ 3
у нас был цикл в нашем объектном графе, который возвращался. Я знаю, что это, вероятно, не ваша проблема, но я добавляю ее здесь, если у кого-то другая проблема. Мы включилиExceptionDetailInFaults, но не получали ошибку в любом клиенте (наше приложение или тестовый клиент WCF). К счастью, он появился в журналах сервера, поэтому мы смогли найти его таким образом.
У нас родительский → child и child → parent для двусторонней навигации, нам пришлось сломать эту ссылку и вместо этого родительский → child, а у ребенка был идентификатор для поиска родителя, тогда ошибка исчезла.
Надеюсь, это поможет кому-то!
Ответ 4
Добавьте следующую конфигурацию в конфигурацию службы wcf. И посмотрите файл c:\log\Traces.svclog.
Мое исключение было брошено,
При попытке сериализации параметра произошла ошибка
Сообщение InnerException было "Значение Enum '0" недопустимо для типа "ThyCams2014.XrmBase.new_filingstatu" и не может быть сериализовано. Убедитесь, что требуемые значения перечисления присутствуют и отмечены атрибутом EnumMemberAttribute, если у этого типа есть код аттрибутора DataContractAttribute. Дополнительную информацию см. В 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>