Что лучший подход должен обработать исключения в сервисе WCF?

Я вижу, что установка 404 страниц в web.config является хорошим чистым методом, НО это все еще первоначально отвечает 302 перенаправлениями к ошибочной странице. Как пример, если Вы перешли к:

https://stackoverflow.com/x.aspx

Вы будете перенаправлены через 302 перенаправления к:

https://stackoverflow.com/404? aspxerrorpath =/x.aspx

, Что я хочу произойти, является этим:

http://www.cnn.com/x.aspx

нет никакого перенаправления. Запрос на недостающий URL возвращает 404 кода статуса с дружественным сообщением об ошибке.

24
задан Daniel Robinson 11 February 2016 в 01:54
поделиться

4 ответа

You can definitely catch and handle all exceptions that happen on your service class and turn them into a FaultException or FaultException exception.

That way, you won't "fault" (or tear down) the communications channel between your client and server.

Even better approach would be to implement the IErrorHandler interface on your service class that provides a way to globally catch all exceptions as they happen and provide a FaultException instead, that's SOAP compliant.

You can even turn your IErrorHandler into a configurable behavior that can be turned on or off in config.

See these articles and blog posts for more details:

35
ответ дан 28 November 2019 в 23:28
поделиться
  1. Создайте настраиваемый класс сбоя, помеченный атрибутом DataContract
  2. Отметьте метод в интерфейсе контракта на обслуживание с помощью FaultContract . Т.е. [FaultContract (typeof (CustomFault))]
  3. В методе обслуживания перехватите любые применимые внутренние исключения и создайте FaultException . В качестве альтернативы, как упоминалось в marc_s, вы можете использовать IErrorHandler для сопоставления исключения с ошибкой.

Лично я создаю базовый класс Fault, который имеет свойство Reason, и расширяю все пользовательские ошибки из этого класса. Когда я хочу выбросить ошибку, я вызываю:

throw Fault.Create<CustomFault>(new CustomFault("Boo hoo"));

Также стоит отметить, что я версирую свои классы ошибок (включая общий класс Fault) вместе со всеми моими другими службами. Это вызывает беспокойство только в том случае, если существует проблема с версией службы, хотя.

Вот основной класс Fault (я удалил проверку аргументов для краткости):

[DataContract(Namespace = XmlVersionNamespace.FaultNamespace)]
public abstract class Fault
{
    internal FaultReason Reason { get; set; }

    protected Fault(string reasonText)
    {
        Reason = new FaultReason(new FaultReasonText(reasonText, CultureInfo.CurrentUICulture));
    }

    public override string ToString()
    {
        return Reason.ToString();
    }

    internal static FaultException<TDetail> Create<TDetail>(TDetail fault) where TDetail : Fault
    {
        return new FaultException<TDetail>(fault, fault.Reason);
    }
}
6
ответ дан 28 November 2019 в 23:28
поделиться

You can design the specific Fault Data Contracts for each of the exception scenario in your WCF service so that you can handle the fault/exception at client side respectively.

2
ответ дан 28 November 2019 в 23:28
поделиться
try
{
  // Actions
}
catch (Exception ex)
{
  // Log the exception
  // Throw Fault Exception back to client
  FaultException fe = new FaultException(ex.Message, new FaultCode("Your fault code"));
  //throw fault exception back to WCF client
  throw fe;
}           
1
ответ дан 28 November 2019 в 23:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: