Обработка исключений с помощью служб данных WCF

Я хочу настроить исключения / ошибки, создаваемые моей службой данных WCF, чтобы клиенты получали как можно больше информации о том, что именно пошло не так / чего не хватает. Есть мысли о том, как этого можно достичь?


person Martinfy    schedule 17.08.2010    source источник


Ответы (4)


Есть несколько вещей, которые вам нужно сделать, чтобы исключения передавались клиенту через HTTP-канал.

  1. Вы должны присвоить своему классу DataService следующее:

    [ServiceBehavior (IncludeExceptionDetailInFaults = true)] открытый класс MyDataService: DataService

  2. Вы должны включить подробные ошибки в конфигурации:

    общедоступный статический void InitializeService (конфигурация DataServiceConfiguration) {config.UseVerboseErrors = true; }

Лучше всего выбросить DataServiceException внутри. Среда выполнения WCF Data Service знает, как сопоставить свойства с ответом HTTP, и всегда будет заключать его в TargetInvocationException.

[WebGet]
public Entity OperationName(string id)
{
    try
    {
        //validate param
        Guid entityId;
        if (!Guid.TryParse(id, out entityId))
            throw new ArgumentException("Unable to parse to type Guid", "id");

        //operation code
    }
    catch (ArgumentException ex)
    {
        throw new DataServiceException(400, "Code", ex.Message, string.Empty, ex);
    }
}

Затем вы можете распаковать это для клиента-потребителя, переопределив HandleException в своем DataService следующим образом:

/// <summary>
/// Unpack exceptions to the consumer
/// </summary>
/// <param name="args"></param>
protected override void HandleException(HandleExceptionArgs args)
{
    if ((args.Exception is TargetInvocationException) && args.Exception.InnerException != null)
    {
        if (args.Exception.InnerException is DataServiceException)
            args.Exception = args.Exception.InnerException as DataServiceException;
        else
            args.Exception = new DataServiceException(400, args.Exception.InnerException.Message);
    }
}

См. здесь для получения дополнительной информации ...

person jaimie    schedule 19.10.2011

Вы можете украсить свой класс обслуживания этим атрибутом ServiceBehaviorAttribute следующим образом:

 [ServiceBehavior(IncludeExceptionDetailInFaults=true)]
 public class PricingDataService : DataService<ObjectContext>, IDisposable
 {
   ...
 }
person Attilah    schedule 02.04.2011

Для этого вам нужно создать собственные исключения. Прочтите этот пост здесь: Зачем создавать пользовательские исключения?

На каком языке ты развиваешься?

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

person Julius A    schedule 17.08.2010
comment
Разрабатываю на C #. Однако исключения, которые я выбрасываю из службы, не достигают клиентов, использующих службу. - person Martinfy; 17.08.2010

Я не думаю, что он хочет знать, как генерировать / перехватывать исключения в .NET.

Он, вероятно, хочет узнать, как сообщить клиентам, использующим службу данных WCF, что что-то (и что) пошло не так, когда на стороне сервера (службы) возникает / перехватывается исключение.

Службы данных WCF используют сообщения HTTP-запроса / ответа, и вы не можете просто передать исключение из службы клиенту.

person Skovly    schedule 17.08.2010