当找不到资源(url)时,Web API 2.2返回自定义404

时间:2015-02-25 12:42:05

标签: c# asp.net-mvc asp.net-web-api asp.net-web-api2 asp.net-web-api-routing

当资源不存在时,我希望能够从web api(iis)接管404响应。

我已经完成了我的研究,只遇到one solution这使得这项工作,但我不确定如何安全"这是因为" routeTemplate"只是{* url}

这篇文章有点请求帮助和解释。

我的应用程序使用MVC和WebAPI ...此模板是否会影响MVC? 有没有办法添加" api"在模板中使用{* url}? (以确保仅使用" ... / api /..."受到影响的请求)

config.Routes.MapHttpRoute("Error404", "{*url}", new { controller = "Error", action = "Handle404" });

有没有人遇到过更简洁的方法来处理这个并在web api中处理404?

编辑1

以上代码会影响我的MVC路线。 我怎样才能添加" api" to" {* url}"?...如果尝试了许多不同的方式而且没有骰子。

1 个答案:

答案 0 :(得分:7)

有完全相同的问题。经过一些研究和反复试验,我找到了一个可行的解决方案。

我使用了RoutePrefix解决方案,并尝试实现类似于MVC控制器在基本控制器中使用 HandleUnknownAction 的方法。

在这篇文章的帮助下:.NET WebAPI Attribute Routing and inheritance允许路由继承,我使用HandleUnknownAction方法为我的Web API创建了一个基本控制器:

public abstract class WebApiControllerBase : ApiController {

    [Route("{*actionName}")]
    [AcceptVerbs("GET", "POST", "PUT", "DELETE")]//Include what ever methods you want to handle
    [AllowAnonymous]//So I can use it on authenticated controllers
    [ApiExplorerSettings(IgnoreApi = true)]//To hide this method from helpers
    public virtual HttpResponseMessage HandleUnknownAction(string actionName) {
        var status = HttpStatusCode.NotFound;
        //This is custom code to create my response content
        //....
        var message = status.ToString().FormatCamelCase();
        var content = DependencyService
            .Get<IResponseEnvelopeFactory>()
            .CreateWithOnlyMetadata(status, message);
        //....
        return Request.CreateResponse(status, content);
    }
}

如果您不想沿着继承路径前进,可以始终将方法直接放入要应用该功能的控制器中。

这允许我使用处理与特定控制器有关的自定义未找到消息的路由前缀,因为我有后台和面向公众的API。

如果URL不适用于ApiController,则默认错误控制器将照常处理未找到的错误。