«Сервер не предоставил значимого ответа» с большим содержанием сообщения - PullRequest
0 голосов
/ 10 мая 2018

Я только что прочитал много возможностей для решения

"Сервер не предоставил значимого ответа; это может быть вызвано из-за несоответствия контракта, преждевременного завершения сеанса или внутреннего ошибка сервера "

WCF исключение,

но никто из них не работал для меня. У меня есть сервисный метод, который выполняет запрос linq через EntityFramework, и у пользователя есть возможность включить или отключить загрузку навигационных свойств. Вот функция.

public List<DataTransferObjects.Equipment> GetEquipments(bool Include = true)
{
    using (Entities.DBEntities context = new Entities.DBEntities())
    {
        return Include ? (from equipment
                          in context.Equipments
                          .Include(equipment => equipment.A)
                          .Include(equipment => equipment.B)
                          .Include(equipment => equipment.C)
                          .Include(equipment => equipment.D)
                          select equipment)?.ToDataTransferObjects<Entities.Equipment, DataTransferObjects.Equipment>().ToList()
                       :
                         (from equipment
                          in context.Equipments
                          select equipment)?.ToDataTransferObjects<Entities.Equipment, DataTransferObjects.Equipment>().ToList()
    }
}

Когда я вызываю функцию через сгенерированную ссылку на службу со значением false Include, она работает нормально, но когда параметр Include равен true, выдает исключение. Я уверен, что проблема заключается в размере сообщения или в некотором связанном с ним размере, потому что если я изменю функцию для запроса первых 20 записей, она будет работать нормально (вся таблица содержит 94 записи), поэтому рабочий запрос linq.

(from equipment
 in context.Equipments
 .Include(equipment => equipment.A)
 .Include(equipment => equipment.B)
 .Include(equipment => equipment.C)
 .Include(equipment => equipment.D)
 select equipment).Take(20)?.ToDataTransferObjects<Entities.Equipment, DataTransferObjects.Equipment>().ToList()

Конфигурация следующая

<system.serviceModel>
<bindings>
  <netTcpBinding>
    <binding name="DefaultBinding" transferMode="Buffered" maxBufferSize="2147483646" maxBufferPoolSize="2147483646" transactionProtocol="OleTransactions" maxReceivedMessageSize="2147483646">
      <readerQuotas maxDepth="2147483646" maxStringContentLength="2147483646" maxArrayLength="2147483646" maxBytesPerRead="2147483646" maxNameTableCharCount="2147483646" />
      <!--<security mode="Transport"> Nothing changed with this option
        <transport clientCredentialType="Windows" protectionLevel="EncryptAndSign" />
        <message clientCredentialType="Windows"/>
      </security>-->
    </binding>
  </netTcpBinding>
</bindings>
<serviceHostingEnvironment aspNetCompatibilityEnabled="false" multipleSiteBindingsEnabled="true" />
<behaviors>
  <serviceBehaviors>
    <behavior name="DefaultBehaviour">
      <dataContractSerializer maxItemsInObjectGraph="2147483646" />
      <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="true" />
      <serviceAuthorization impersonateCallerForAllOperations="true" />
    </behavior>
  </serviceBehaviors>
</behaviors>
<services>
  <service behaviorConfiguration="DefaultBehaviour" name="ServiceLibrary.Service">
    <endpoint address="WCFService" binding="netTcpBinding" bindingConfiguration="DefaultBinding" contract="ServiceLibrary.IService" />
    <host>
      <baseAddresses>
        <add baseAddress="net.tcp://localhost:8080" />
      </baseAddresses>
    </host>
  </service>
</services>
</system.serviceModel>

1 Ответ

0 голосов
/ 10 мая 2018

Вот несколько вещей, о которых стоит подумать

  1. И клиент, и сервер отвечают за установку значений конфигурации для размера и т. Д. Если вас беспокоит этот тип вещей, убедитесь, что клиентская конфигурация установлена ​​правильно.

  2. Если вы считаете, что это проблема размера, просто ограничитесь одной или несколькими записями, это должно дать вам хорошее указание.

  3. Мои деньги заняты не настройкой размера (ошибка MaxReceivedMessageSize или чем-то подобным) и, скорее всего, проблемой сериализации в одном из вложенных контрактов. Попробуйте реализовать включенные по одному за раз

    • Попробуйте и выясните, какой контракт вызывает проблему. Может быть, просто упустить что-то простое.
    • Еще раз, попробуйте начать с чего-то, что работает, и продолжайте добавлять больше сложности, пока не найдете проблему

В качестве бонуса, это полное злоупотребление троичными операторами и выглядит отвратительно :) Просто говорю ...

Удачи

...