【问题标题】:Handling WCF Rest Service exceptions only in one place仅在一处处理 WCF Rest Service 异常
【发布时间】:2013-08-07 15:41:36
【问题描述】:

我正在开发一个将在 IIS 上托管的 WCF Rest 服务。

现在我正在实施服务合同,当我尝试处理异常时,我发现我在所有方法上重复相同的代码。

这是我的服务合同方法之一:

public void DeleteMessage(string message_id)
{
    int messageId;
    OutgoingWebResponseContext ctx =
        WebOperationContext.Current.OutgoingResponse;

    if ((message_id == null) || (!Int32.TryParse(message_id, out messageId)) || (messageId < 1))
    {
        ctx.StatusCode = System.Net.HttpStatusCode.BadRequest;
        ctx.StatusDescription = "message_id parameter is not valid";
        throw new ArgumentException("DeleteMessage: message_id is not valid", "message_id");
    }

    try
    {
        using (var context = new AdnLineContext())
        {
            Message message = new Message() { MessageId = messageId };

            context.Entry(message).State = EntityState.Deleted;
            context.SaveChanges();

            ctx.StatusCode = System.Net.HttpStatusCode.OK;
        }
    }
    catch (Exception ex)
    {
        ctx.StatusCode = System.Net.HttpStatusCode.InternalServerError;
        ctx.StatusDescription = ex.Message;
        ctx.SuppressEntityBody = true;
    }
}

在我的所有方法中,我都可以抛出 ArgumentExceptionException,并通过返回 HTTP STATUS CODE 来管理它们。

有没有办法在全局范围内捕获这些异常?

【问题讨论】:

    标签: c# wcf rest


    【解决方案1】:

    MS-recommended 方法似乎遵循FaultException 模式。这个想法是实现IErrorHandler 接口。 This answer 解释了如何在 WCF 配置中进行设置。

    看到这种模式在旧式 WCF 服务中的实现,我可以说它可能只对复杂的企业级场景有意义。对于简单的情况,我会坚持手动抛出异常。

    另一种选择是使用Web API 实现REST 服务。它有很好的异常处理 strategy 开箱即用,这就是微软在 .NET Technology Guide for Business Applications 中实际推荐的 REST 开发。

    【讨论】:

    • 感谢您的完整回答,但我不是复杂的企业级方案。我只想不重复代码。谢谢。
    • 嗯,简而言之,没有很好的简单替代方法来引发异常,主要是因为 WCF 首先对 HTTP 不太友好。我会在 Web API 中完成整个事情,我花了两天时间从头开始完全弄清楚 - 使用 MVC 代码约定的样板更少。
    • 这是我要找的:dotnet.dzone.com/news/wcf-rest-tip-2 对不起,我解释得不好。
    【解决方案2】:

    WCF 具有出色的内置可扩展性机制,可将异常转换为错误。这个扩展点可以通过 IErrorHandler 接口使用,该接口提供了两个方法:HandleError 和 ProvideFault。 HandleError 方法在调用完成后在单独的线程上调用,以可能记录错误并执行其他操作。下面是一个有用的链接

    http://msdn.microsoft.com/en-us/library/system.servicemodel.dispatcher.ierrorhandler.providefault.aspx

    服务 web.config 文件中的 LoggingConfiguration 部分是记录错误的另一个选项。

    http://msdn.microsoft.com/en-us/library/aa303433.aspx

    【讨论】:

      猜你喜欢
      • 2011-12-20
      • 1970-01-01
      • 2011-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-01
      相关资源
      最近更新 更多