3

我正在开发一个将在 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;
    }
}

在我的所有方法中,我都可以抛出 anArgumentException或 an Exception,并使用 return a 来管理它们HTTP STATUS CODE

有什么办法可以在全球范围内捕获该异常?

4

2 回答 2

2

MS 推荐的方法似乎遵循FaultException模式。这个想法是实现IErrorHandler接口。这个答案解释了如何在 WCF 配置中进行设置。

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

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

于 2013-08-08T12:49:59.890 回答
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

于 2013-08-08T13:40:12.443 回答