繁体   English   中英

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

[英]Web API 2.2 return custom 404 when resource (url) not found

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

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

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

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

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

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

编辑1

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

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

我使用了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);
    }
}

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM