在一个地方处理WCF Rest服务异常

3

我正在开发一个WCF Rest服务,我打算在IIS上托管它。

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

这是我的其中一个服务合同方法:

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

在我的所有方法中,我都可以抛出 ArgumentException 或者 Exception 异常,并通过返回一个 HTTP 状态码 来处理它们。

是否有一种全局捕获异常的方式?

2个回答

2

微软推荐的方法似乎遵循了FaultException模式。思路是实现IErrorHandler接口。 这个答案解释了如何在WCF配置中设置它。

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

另一种选择是使用Web API实现REST服务。它有一个很好的异常处理策略,并且这正是微软在.NET技术指南之商业应用中推荐的REST开发方式。


谢谢你的完整回答,但我不需要复杂的企业级场景。我只是想避免重复代码。谢谢。 - VansFannel
简而言之,没有很好的简单替代方案来抛出异常,主要是因为 WCF 本身不太适合 HTTP。我会改用 Web API 来完成整个任务,从头开始完全弄明白只花了两天时间——使用 MVC 代码约定更少的样板文件。 - Dmitry Sevastianov
这就是我一直在寻找的内容:http://dotnet.dzone.com/news/wcf-rest-tip-2。抱歉,我没有解释清楚。 - VansFannel

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接