了解Web API返回值

时间:2017-03-13 18:03:00

标签: asp.net asp.net-mvc asp.net-web-api

所以,我一直在ASP.NET MVC中实现一个Web API,并且一切正常。

但现在我需要返回特殊状态信息。所以我知道我可以从API返回一个自定义类,调用者可以将它反序列化为一个对象。但是,在这种情况下,如果我的API抛出异常会发生什么?

MVC似乎会自动返回有关异常的信息,我很好奇这个逻辑将如何与我的逻辑融合以返回自定义类结果。

我意识到我可以使用try...catch块,但是如果有异常,似乎我可能希望保留逻辑MVC以便返回适当的值。

2 个答案:

答案 0 :(得分:1)

可以在Global.asax的Application_Error函数中处理未处理的异常。或者,您可以使用例外过滤器,请参阅Exception Filters on Microsoft Docs

答案 1 :(得分:1)

如果你想确保api返回相同的类,即使发生错误,我也会使用ExceptionFilters

创建自己的IHttpActionResult实现

public class ExceptionProvider : IExceptionHandler
{
    public virtual Task HandleAsync(ExceptionHandlerContext context,
                                    CancellationToken cancellationToken)
    {
        if (!ShouldHandle(context))
        {
            return Task.FromResult(0);
        }

        return HandleAsyncCore(context, cancellationToken);
    }

    public virtual Task HandleAsyncCore(ExceptionHandlerContext context,
                                       CancellationToken cancellationToken)
    {
        HandleCore(context);
        return Task.FromResult(0);
    }

    public virtual void HandleCore(ExceptionHandlerContext context)
    {
        //Use the FormatErrorResponse here
        context.Result = new FormatErrorResponse
        {
            Request = context.ExceptionContext.Request,
            exception = context.Exception
        };
    }

    public virtual bool ShouldHandle(ExceptionHandlerContext context)
    {

        return context.ExceptionContext.CatchBlock.IsTopLevel;
    }
}

然后创建使用FormatErrorResponse类

的过滤器
config.Services.Replace(typeof(IExceptionHandler), new ExceptionProvider());

最后,将过滤器附加到WebApiConfig类中的HttpConfiguration

{{1}}