"Сервер не предоставил значимого ответа" с большим содержанием сообщения
Я только что прочитал много возможностей для решения
"Сервер не предоставил значимого ответа; это может быть вызвано несоответствием контракта, преждевременным завершением сеанса или внутренней ошибкой сервера"
Исключение 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 равен 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 ответ
Вот несколько вещей, чтобы думать о
И клиент, и сервер несут ответственность за установку значений конфигурации для размера и т. Д. Если вы беспокоитесь о таких вещах, убедитесь, что конфигурация клиента установлена правильно.
Если вы считаете, что это проблема размера, просто ограничитесь одной или несколькими записями, это должно дать вам хорошее представление.
Мои деньги на не размер настройки (
MaxReceivedMessageSize
ошибка или что-то подобное) и, скорее всего, проблема с сериализацией в одном из вложенных контрактов. Попробуйте реализовать по одному, чтобы- Попробуйте выяснить, какой контракт вызывает проблему. Может быть, просто не хватает чего-то простого.
- Еще раз попробуйте начать с чего-то, что работает, и продолжайте добавлять больше сложности, пока не найдете проблему
В качестве бонуса, это полное злоупотребление троичными операторами и выглядит отвратительно:) Просто говорю...
Удачи