Этот вопрос является дубликатом System.ServiceModel.CommunicationException: The underlying connection was closed, но это не решило мою проблему.CommunicationException во время запроса WCF, базовое соединение было закрыто
Я использую службу WCF, которая записывает и считывает из базы данных. Но в некоторых случаях запрос отменяется с помощью CommunicationException, в котором говорится, что основное соединение было закрыто. Больше никаких подробностей не приводится.
Я включил отслеживание, но в журнале нет записей, касающихся этого запроса. Я попытался установить MaxItemsInObjectGraph
на 65535, но ничего не изменилось. Возможно, мои конфиги неверно настроены, может кто-то взглянуть на них?
Web.config
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.diagnostics>
<sources>
<source name="System.ServiceModel"
switchValue="Information, ActivityTracing"
propagateActivity="true" >
<listeners>
<add name="xml"/>
</listeners>
</source>
<source name="System.ServiceModel.MessageLogging">
<listeners>
<add name="xml"/>
</listeners>
</source>
<source name="myUserTraceSource"
switchValue="Information, ActivityTracing">
<listeners>
<add name="xml"/>
</listeners>
</source>
</sources>
<sharedListeners>
<add name="xml"
type="System.Diagnostics.XmlWriterTraceListener"
initializeData="Error.svclog" />
</sharedListeners>
</system.diagnostics>
<appSettings>
<add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
</appSettings>
<system.web>
<compilation debug="true" targetFramework="4.5" />
<httpRuntime targetFramework="4.5"/>
</system.web>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior>
<!-- Legen Sie die Werte unten vor der Bereitstellung auf "false" fest, um die Veröffentlichung von Metadateninformationen zu vermeiden. -->
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
<!-- Damit in Fehlern Ausnahmedetails zum Debuggen angezeigt werden, legen Sie den Wert unten auf "true" fest. Legen Sie ihn vor der Bereitstellung auf "false" fest, um die Veröffentlichung von Ausnahmeinformationen zu vermeiden. -->
<serviceDebug includeExceptionDetailInFaults="true"/>
<!-- Umgeht eine CommunicationException, die auftritt, wenn der ObjectGraph überläuft -->
<dataContractSerializer maxItemsInObjectGraph="65535"/>
</behavior>
</serviceBehaviors>
</behaviors>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_IDBUpdater"
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" />
</binding>
<binding maxReceivedMessageSize="2147483647" allowCookies="true">
<readerQuotas maxDepth="32" maxStringContentLength="2147483647"
maxArrayLength="2147483647" maxBytesPerRead="2147483647"
maxNameTableCharCount="2147483647" />
</binding>
</basicHttpBinding>
</bindings>
<protocolMapping>
<remove scheme="http" />
<add scheme="http" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IDBUpdater" />
</protocolMapping>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
</system.serviceModel>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
<!--
Um das Stammverzeichnis der Webanwendung beim Debuggen auszuwählen, legen Sie den Wert unten auf "true" fest.
Legen Sie ihn vor der Bereitstellung auf "false" fest, um die Veröffentlichung von Informationen über den Webanwendungsordner zu vermeiden.
-->
<directoryBrowse enabled="true"/>
</system.webServer>
</configuration>
App.config:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_IDBUpdater" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
allowCookies="false" bypassProxyOnLocal="false" maxBufferPoolSize="2147483647"
maxReceivedMessageSize="2147483647" useDefaultWebProxy="true" />
<binding allowCookies="true" maxReceivedMessageSize="2147483647">
<readerQuotas maxDepth="32" maxStringContentLength="2147483647"
maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
</binding>
</basicHttpBinding>
</bindings>
<client>
<endpoint address="http://10.1.58.48/DBUpdate/UpdateService.svc"
binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IDBUpdater"
contract="UpdateService.IDBUpdater" />
</client>
</system.serviceModel>
</configuration>
Я не очень хорошо знакомы с конфигурацией WCF. Есть ли что-то не так или почему я продолжаю получать это сообщение об ошибке?
Пример кода: появляется
string cmd = @"SELECT trainer.TID, anrede.Anrede, trainer.Titel, trainer.Vorname, trainer.Nachname, trainer.Festnetz, trainer.Mobil, trainer.Email, trainer.Trainerstatus, trainer.Honorar
FROM trainer
left join anrede on trainer.Anrede = anrede.ID
Group by trainer.TID";
var client = new DBUpdaterClient();
dt = client.ExecuteReaderUGV(Helpers.GetUsername(), cmd);
Ошибка после вызова ExecuteReaderUGV()
, результирующий объект данных таблицы должны иметь около 3500 записей. С меньшими таблицами данных (< 50) он отлично работает.
Сообщение об ошибке: Подключенное соединение было закрыто: соединение было неожиданно закрыто.
UPDATE:
Мы отслеживали проблему вплоть до ключевого слова left join
. При замене на inner join
он отлично работает. Однако нам непонятно, почему это происходит. Когда мы обращаемся к базе данных без веб-службы и выполняем команду sql с left join
, она работает. Когда мы используем веб-сервис, это не так.
UPDATE II:
Проблема заключается условие в left join
: если условие не может быть оценена (например, одно значение не существует) на вызов отвечает веб-службы с Communication Exception
. Кто-нибудь знает об этом больше?
Можете ли вы дать образец кода полного вызова службы, которая дает вам вопрос? – Kritner
Я отредактировал вопрос и добавил более подробную информацию. – xmashallax