WCF-клиент - не ловится FaultException
От: mDmitriy Россия  
Дата: 01.09.16 10:43
Оценка:
Всем привет!

Есть WCDL от стороннего сервиса, в которой в частности, прописано примерно следующее:
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
[System.ServiceModel.ServiceContractAttribute(Namespace="OtherNamespace", ConfigurationName="OtherNamespace.IOtherInterface")]
public interface IIOtherInterface {
        
[System.ServiceModel.OperationContractAttribute(Action="OtherNamespace/OtherOperation", ReplyAction="OtherNamespace/OtherOperation/OtherResponse")]
[System.ServiceModel.FaultContractAttribute(typeof(OtherNamespace.OtherFault), Action="OtherNamespace/IOtherInterface/OtherOperationOtherFault", Name="OtherFault", Namespace="OtherNamespace.Interface")]
OtherNamespace.OtherResponse OtherOperation(OtherNamespace.OtherRequestRequest request);

Т.е., как бы намекается, что при ошибке сервис сгенерирует и вернет исключение типа FaultException<OtherNamespace.OtherFault>
При ошибочном запросе сервис вроде возвращает то, что нужно (это видно через Fiddler) с ошибкой 500
Но на клиенте этот момент не перехватывается
try
    myClient.OtherOperation(otherRequest)
catch(Exception ex)
{
    // анализ exception
    // возвращается всегда ObjectDisposedException ("доступ к закрытому потоку невозможен") (видимо, при попытке сериализации)
    // и все
}

Под отладчиком через AppDomain.CurrentDomain.FirstChanceException можно перехватыватить WebException 2 раза, но в исполняемом коде сделать это не получается (видимо, гасится где-то внутри)
Что у меня может быть не так?
И как перехватывать ошибку 500?
Спасибо...
Re: WCF-клиент - не ловится FaultException
От: Sharov Россия  
Дата: 01.09.16 12:10
Оценка: 3 (1)
Здравствуйте, mDmitriy, Вы писали:


D>При ошибочном запросе сервис вроде возвращает то, что нужно (это видно через Fiddler) с ошибкой 500

D>Но на клиенте этот момент не перехватывается

D>Под отладчиком через AppDomain.CurrentDomain.FirstChanceException можно перехватыватить WebException 2 раза, но в исполняемом коде сделать это не получается (видимо, гасится где-то внутри)

D>Что у меня может быть не так?
D>И как перехватывать ошибку 500?
D>Спасибо...

WCF логи на клиенте смотрели? Если нет, то включите и посмотрите в чем дело -- мож сериализации где глючит...
Кодом людям нужно помогать!
Re[2]: WCF-клиент - не ловится FaultException
От: mDmitriy Россия  
Дата: 05.09.16 09:38
Оценка:
Здравствуйте, Sharov, Вы писали:
S>WCF логи на клиенте смотрели? Если нет, то включите и посмотрите в чем дело -- мож сериализации где глючит...
Смотрел — ничего там нету подозрительного
Если сервер не возвращает ошибку, то все нормально десериализуется
А если вернул 500 — только исключение о конце потока
Где искать причину и как перехватывать — непонятно
Re: WCF-клиент - не ловится FaultException
От: BratGanjubas Россия  
Дата: 05.09.16 09:47
Оценка: 4 (1)
Здравствуйте, mDmitriy, Вы писали:

D>Что у меня может быть не так?

D>И как перехватывать ошибку 500?
D>Спасибо...

WebHttpBehavior.FaultExceptionEnabled не помогает?
Re[3]: WCF-клиент - не ловится FaultException
От: Михаил Романов Удмуртия https://mihailromanov.wordpress.com/
Дата: 05.09.16 11:03
Оценка:
Здравствуйте, 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>
Re[2]: WCF-клиент - не ловится FaultException
От: mDmitriy Россия  
Дата: 05.09.16 12:09
Оценка:
Здравствуйте, BratGanjubas, Вы писали:
BG>WebHttpBehavior.FaultExceptionEnabled не помогает?
я не использую этот Behavior...
Re: Разобрался... Но вопрос остался
От: mDmitriy Россия  
Дата: 05.09.16 12:20
Оценка:
В общем, как всегда — "дело было не в бобине"(с)

AppDomain.FirstChanceException перехватывал, в частности, WebException и считывал его поток
if(webException.Response != null)
{
    using(var responseStream = webException.Response.GetResponseStream())
    {
        // далее в лог

Как я понимаю, WCF должен обработать WebException (после FirstChanceException) и кинуть соответствующий FaultExeption
Но т.к. поток уже считан, то и выкидывалось внутри исключение "Доступ к закрытому потоку", что вполне логично
Когда закомментил перехват WebException, все заработало

А теперь вопрос — как считать из WebException поток более одного раза?
Ибо теперь в нужный лог эта ошибка не выводится

Спасибо
Re[2]: Разобрался... Но вопрос остался
От: Sharov Россия  
Дата: 05.09.16 12:28
Оценка: 3 (1)
Здравствуйте, mDmitriy, Вы писали:

D>А теперь вопрос — как считать из WebException поток более одного раза?

D>Ибо теперь в нужный лог эта ошибка не выводится

D>Спасибо


http://stackoverflow.com/questions/28317386/cant-get-responsestream-from-webexception
http://stackoverflow.com/questions/1167913/webexception-when-reading-a-webexceptions-response-stream
Кодом людям нужно помогать!
Re[3]: Разобрался... Но вопрос остался
От: mDmitriy Россия  
Дата: 06.09.16 13:41
Оценка:
Здравствуйте, Sharov, Вы писали:
S>http://stackoverflow.com/questions/28317386/cant-get-responsestream-from-webexception
S>http://stackoverflow.com/questions/1167913/webexception-when-reading-a-webexceptions-response-stream
помогло, спасибо
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.