所以,我一直在ASP.NET MVC中实现一个Web API,并且一切正常。
但现在我需要返回特殊状态信息。所以我知道我可以从API返回一个自定义类,调用者可以将它反序列化为一个对象。但是,在这种情况下,如果我的API抛出异常会发生什么?
MVC似乎会自动返回有关异常的信息,我很好奇这个逻辑将如何与我的逻辑融合以返回自定义类结果。
我意识到我可以使用try...catch
块,但是如果有异常,似乎我可能希望保留逻辑MVC以便返回适当的值。
答案 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}}