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

Gus*_*avo 9 c# asp.net-mvc asp.net-web-api asp.net-web-api-routing asp.net-web-api2

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

我已经完成了我的研究,并且只遇到了一个使这项工作成功的解决方案,但我不确定它是多么"安全",因为"routeTemplate"只是{*url}

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

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

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

有没有人遇到过这样做更清洁的方式并在web api中处理404?

编辑1

上面的代码会影响我的MVC路由.如何将"api"添加到"{*url}"?...如果尝试了许多不同的方式而没有骰子.

Nko*_*osi 7

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

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

在这篇文章的帮助下:.NET WebAPI属性路由和继承以允许路由继承,我使用如下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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

如果URL不适用于ApiController默认错误控制器将像往常一样处理未找到的.