Я только что прочитал много возможностей для решения
"Сервер не предоставил значимого ответа; это может быть вызвано
из-за несоответствия контракта, преждевременного завершения сеанса или внутреннего
ошибка сервера "
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>