2009-10-05 2 views
5

Я конвертирую код из ASMX в WCF. В моих ASMX веб-сервисах я запрокинуть исключения SOAP, как:Какой тип исключения должен быть брошен с помощью службы WCF?

if (ex.InnerException != null) 
       { 
        SoapException se = new SoapException(ex.Message, SoapException.ServerFaultCode, Context.Request.Url.AbsoluteUri, ex.InnerException); 
        throw se; 
       } 

Какие исключения я должен бросить обратно клиент WCF, призывающий мою службу? Я предполагаю, что SOAP exceptin является неправильным, потому что тестовый клиент не видит в нем правильной ошибки и просто говорит - внутренняя ошибка произошла в веб-службе.

ответ

20

В принципе, в службе WCF вам лучше всего, когда вы бросаете только FaultException (или FaultException<T>).

Это связано с двумя вещами: поскольку WCF предназначен для взаимодействия (ваш клиент может легко быть не.NET-приложением), вы не должны использовать .NET-исключения - они слишком специфичны для платформы. И два: если вы используете FaultExceptions (которые преобразуются в ошибки SOAP), ваш канал (соединение между клиентом и сервером) не будет снесен или «неисправен». Среда выполнения WCF на стороне сервера рассматривает все не обработанные исключения .NET как «серьезные» исключения и, таким образом, помещает канал в неисправное состояние, предполагая, что произошло что-то действительно плохое.

Если ваш канал неисправен, вы больше не сможете его использовать - вам придется закрыть прокси-сервер клиента и воссоздать его с нуля.

Если вы хотите (или должны) быть очень совместимы, вы должны определить ваши ошибки SOAP являются вина контракты (аналогично договорам данных) в отдельном файле, а затем вы бы бросить FaultException<T> где Т будет один из ваших контрактов о сбоях. Если вы строго .NET с обеих сторон, вы также можете привязать исключения .NET к исключению FaultException как общий тип T, если хотите - канал не будет сбой (например, вы могли бы выбросить FaultException<InvalidOperationException> и, таким образом, сообщить о том, что произошло неправильно).

+1

Отличное объяснение, я бы хотел, чтобы я мог дважды подпереть. Благодарю. – Noich

3

В WCF вы используете FaultException. См. Например, here.

+0

+1 для обмена превосходным примером. – SBirthare

Смежные вопросы