Метод WCF называется дважды
У меня есть веб-служба, которая возвращает данные в настольное приложение. Проблема, с которой я сталкиваюсь, заключается в том, что когда веб-служба возвращает небольшой объем данных, все работает нормально, но когда объем данных является большим, он выдает следующее исключение:
System.Net.WebException: базовое соединение было закрыто: произошла непредвиденная ошибка при получении.
И когда я отлаживаю веб-службу, я вижу, что этот конкретный метод вызывается дважды. Он выполняет оператор return в первый раз, когда ничего не происходит, но когда он выполняет его во второй раз, вышеупомянутое исключение бросается в настольном приложении.
Я нашел похожие сообщения раньше в stackoverflow, но они не решили мою проблему. Может кто-нибудь, пожалуйста, скажите мне, что здесь происходит?
Спасибо!
Ответы
Ответ 1
Возможно, это связано с тем, что размер сообщения больше, чем размер сообщения по умолчанию. Вы можете попробовать увеличить это значение в конфигурации конечной точки. Вы также можете посмотреть этот пост.
UPDATE:
Чтобы еще больше диагностировать проблему, я предлагаю вам активировать трассировку службы, поместив в конфигурационный файл следующее:
<system.diagnostics>
<trace autoflush="true">
</trace>
<sources>
<source name="System.ServiceModel"
switchValue="Information, ActivityTracing"
propagateActivity="true">
<listeners>
<add name="sdt"
type="System.Diagnostics.XmlWriterTraceListener"
initializeData="WcfDetailTrace.e2e" />
</listeners>
</source>
</sources>
</system.diagnostics>
Это создаст файл трассировки WcfDetailTrace.e2e
, который вы можете открыть с помощью Инструмента просмотра трассировки служб, который предоставит вам обширную информацию о вызова и сообщения об ошибке.
Ответ 2
Недавно у меня была эта проблема.
Оказалось, что анализ журнала WCF, написанный System.Diagnostics.XmlWriterTraceListener, вызвал проблему с контрактом данных, который я установил.
Я возвращаюсь Dictionary<int, object>
(Боковое примечание: Да, я знаю, что это действительно плохо!, но я молод и нуждаюсь в деньгах). Я забыл включить атрибут [KnownType] в возвращаемое значение для DataContract:
[DataContract]
[KnownType(typeof(Dictionary<int, double>))]
[KnownType(typeof(Dictionary<int, ChannelData>))]
[KnownType(typeof(Dictionary<string, Dictionary<int, double>>))]
public class MyCoolObject: ICoolObject
{
[DataMember]
public Dictionary<string, object> Results
{
get { return _results; }
set { _results = value; }
}
}
Ответ 3
У меня тоже была эта проблема. Для меня это происходило, потому что у меня было свойство [DataMember]
с get{}
, но не set{}
. После добавления set{}
это поведение остановилось.
Ответ 4
У меня недавно была эта проблема, и оказалось, что я забыл отметить один из классов передачи данных с помощью [DataContract]
Ответ 5
Я столкнулся с этой же проблемой. Оказалось, что WCF не смог вернуть DateTime
как JSON, поэтому мне пришлось сделать это Nullable<DateTime>
.
Ответ 6
У меня также была эта проблема, и мое решение было похоже на Batgar's, но с завихрением. У меня был класс, у которого было свойство типа object
. Мне пришлось добавлять атрибуты KnownType
к классу для каждого типа объекта, который мог бы содержать объект. Я не мог заполнить KnownType
на лету, поскольку класс не знал, что будет содержать этот объект.
Ответ 7
Я столкнулся с теми же симптомами, что и OP, но моей целью был веб-сервис Oracle, который я не могу контролировать. Вызовы WebService работали нормально из автономного тестового веб-приложения, но не из приложения .NET, которое требовало реализации.
Я не понимаю почему, но обновление targetFramework
в web.config с 4.5 до 4.6.1 targetFramework
проблему для моего приложения.
<httpRuntime targetFramework="4.5" requestValidationMode="4.5" executionTimeout="36000"/>
<httpRuntime targetFramework="4.6.1" requestValidationMode="4.5" executionTimeout="36000"/>