Обработка исключений с помощью WCF Data Services - PullRequest
8 голосов
/ 17 августа 2010

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

Ответы [ 4 ]

10 голосов
/ 19 октября 2011

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

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

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

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

    public static void InitializeService (DataServiceConfiguration config) {config.UseVerboseErrors = true;}

Лучше всего бросить DataServiceException в.Среда выполнения службы данных WCF знает, как сопоставить свойства с ответом 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);
    }
}

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

3 голосов
/ 02 апреля 2011

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

 [ServiceBehavior(IncludeExceptionDetailInFaults=true)]
 public class PricingDataService : DataService<ObjectContext>, IDisposable
 {
   ...
 }
0 голосов
/ 17 августа 2010

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

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

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

0 голосов
/ 17 августа 2010

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

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

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

...