2015-07-01 2 views
2

Этот вопрос является дубликатом 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. Кто-нибудь знает об этом больше?

+0

Можете ли вы дать образец кода полного вызова службы, которая дает вам вопрос? – Kritner

+0

Я отредактировал вопрос и добавил более подробную информацию. – xmashallax

ответ

0

Успешное решение: Заменить DataTable с DataSet

Я не знаю, почему, но исключение исчезло с тех пор.

0

Поскольку я не могу комментировать, вы ловите исключение CommumnicationException? Что говорит свойство Message этого исключения?

0

Если WCF вернуть DataTable, когда вы создаете DataTable объект, который нужно использовать этот costructor:

var dt = new DataTable("Anything"); 

Вы можете использовать эту функцию:

public DataTable ExecuteRequest(string requete) 
    { 

     var dt = new DataTable("Anything"); // this will resolve your problem 
     if (requete!= string.Empty) 
     { 
      using (con = new SqlConnection(ConString)) 
      { 
       var cmd = new SqlCommand(requete, con); 
       var sda = new SqlDataAdapter(cmd); 


       sda.Fill(dt); 


      } 
     } 
     return dt; 
    } 

я надеюсь, что это будет решать ваша проблема

+0

Вот как мы это делаем. – xmashallax

Смежные вопросы