使用WCF数据服务进行异常处理

时间:2010-08-17 10:58:50

标签: exception-handling wcf-data-services

我想自定义从我的WCF数据服务抛出的异常/错误,以便客户尽可能多地获取有关哪些错误/缺少什么的信息。有关如何实现这一目标的任何想法?

4 个答案:

答案 0 :(得分:10)

您需要做一些事情来确保异常通过HTTP管道传递到客户端。

  1. 您必须使用以下内容对DataService类进行归属:

    [ServiceBehavior(IncludeExceptionDetailInFaults = true)] 公共类MyDataService:DataService

  2. 您必须在配置中启用详细错误:

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

  3. 最好将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);
        }
    }
    

    然后,您可以通过覆盖DataService中的HandleException来为客户端使用者解压缩,如下所示:

    /// <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);
        }
    }
    

    有关详细信息,请参阅here

答案 1 :(得分:3)

您可以使用此属性ServiceBehaviorAttribute来装饰您的服务类,如下所示:

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

答案 2 :(得分:0)

您需要为此创建自定义例外。 请在此处阅读此帖:Why Create Custom Exceptions?

您正在开发哪种语言?

如果您需要进一步的指导,请添加一些评论。

答案 3 :(得分:0)

我认为他不想知道如何在.NET中抛出/捕获异常。

他可能想知道如何告诉客户端使用WCF数据服务在服务器(服务)端抛出/捕获异常时出现了什么(和什么)错误。

WCF数据服务使用HTTP请求/响应消息,您不能只是从服务向客户端抛出异常。