簡體   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