Т.е., как бы намекается, что при ошибке сервис сгенерирует и вернет исключение типа FaultException<OtherNamespace.OtherFault>
При ошибочном запросе сервис вроде возвращает то, что нужно (это видно через Fiddler) с ошибкой 500
Но на клиенте этот момент не перехватывается
try
myClient.OtherOperation(otherRequest)
catch(Exception ex)
{
// анализ exception
// возвращается всегда ObjectDisposedException ("доступ к закрытому потоку невозможен") (видимо, при попытке сериализации)
// и все
}
Под отладчиком через AppDomain.CurrentDomain.FirstChanceException можно перехватыватить WebException 2 раза, но в исполняемом коде сделать это не получается (видимо, гасится где-то внутри)
Что у меня может быть не так?
И как перехватывать ошибку 500?
Спасибо...
D>При ошибочном запросе сервис вроде возвращает то, что нужно (это видно через Fiddler) с ошибкой 500 D>Но на клиенте этот момент не перехватывается
D>Под отладчиком через AppDomain.CurrentDomain.FirstChanceException можно перехватыватить WebException 2 раза, но в исполняемом коде сделать это не получается (видимо, гасится где-то внутри) D>Что у меня может быть не так? D>И как перехватывать ошибку 500? D>Спасибо...
WCF логи на клиенте смотрели? Если нет, то включите и посмотрите в чем дело -- мож сериализации где глючит...
Здравствуйте, Sharov, Вы писали: S>WCF логи на клиенте смотрели? Если нет, то включите и посмотрите в чем дело -- мож сериализации где глючит...
Смотрел — ничего там нету подозрительного
Если сервер не возвращает ошибку, то все нормально десериализуется
А если вернул 500 — только исключение о конце потока
Где искать причину и как перехватывать — непонятно
Здравствуйте, mDmitriy, Вы писали:
D>А если вернул 500 — только исключение о конце потока D>Где искать причину и как перехватывать — непонятно
Судя по вашим 2-м сообщениям, в теле ответа с ошибкой ничего нет. Так?
Если да, то всё верно — сервер генерирует ошибку, но это не ожидаемый вами фолт, а что-то свое (почему так — это вопрос). В результате клиент не может разобрать ответ (не может его десериализовать) и палает с ошибкой конца потока.
Вот, для примера как выглядит сгенерированный простейший Fault-ответ от WCF сервиса
HTTP/1.1 500 Internal Server Error
Content-Length: 352
Content-Type: text/xml; charset=utf-8
Server: Microsoft-HTTPAPI/2.0
Date: Mon, 05 Sep 2016 10:53:42 GMT
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<s:Fault>
<faultcode>s:Client</faultcode>
<faultstring xml:lang="en-US">The creator of this fault did not specify a Reason.</faultstring>
<detail>
<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">Hello, world fault!</string>
</detail>
</s:Fault>
</s:Body>
</s:Envelope>
AppDomain.FirstChanceException перехватывал, в частности, WebException и считывал его поток
if(webException.Response != null)
{
using(var responseStream = webException.Response.GetResponseStream())
{
// далее в лог
Как я понимаю, WCF должен обработать WebException (после FirstChanceException) и кинуть соответствующий FaultExeption
Но т.к. поток уже считан, то и выкидывалось внутри исключение "Доступ к закрытому потоку", что вполне логично
Когда закомментил перехват WebException, все заработало
А теперь вопрос — как считать из WebException поток более одного раза?
Ибо теперь в нужный лог эта ошибка не выводится
Здравствуйте, mDmitriy, Вы писали:
D>А теперь вопрос — как считать из WebException поток более одного раза? D>Ибо теперь в нужный лог эта ошибка не выводится
D>Спасибо