我有一個相當簡單的Web API應用程序,目前有一個路線設置。如果用戶嘗試訪問任何其他路由,他們將獲得404回來,但404的主體是HTML而不是JSON(這是它們的接受頭要求的內容)。什麼是最簡單(至少代碼/配置添加到我的項目)的方式讓IIS響應與JSON錯誤響應而不是網頁的不存在路由的請求?如何在WebAPI中返回404s和403s的json?
同樣的問題適用於403s。如果我嘗試導航到我的應用程序的根目錄,則會返回403,再次作爲網頁。我寧願這是一個404,但更大的問題是我如何使所有來自我的應用程序的響應是JSON而不是僅在有效路由上的響應?我提到了403,因爲我正在尋找一個更廣泛的解決方案,而不是僅僅建立一條全面的路線,因爲我不相信這會幫助我解決控制器操作之外發生的403或任何其他隨機異常。
最好,我希望我的應用程序尊重請求上的accept頭。然而,由於我的API現在只支持JSON,我願意與(暫時)共處,它總是以JSON響應。
我正在使用WebAPI 2.2和.NET 4.5.2。
編輯
這不是一個格式化的問題。格式化程序正確地應用於成功的消息,並遵循請求中的accept頭。這特別是未處理的路由和Web服務器錯誤的問題(如嘗試訪問Web根目錄時被禁止)。
編輯2
重現步驟:
- 打開Visual Studio 2013更新4
- 新建項目
- 選擇的.NET Framework 4.5.2
- 選擇模板> Visual C#> Web> ASP.NET Web應用程序
- 選擇「空」,將所有文件夾和核心參考取消選中。
- 右鍵單擊項目>添加>新建腳手架項目> Web API 2控制器 - 清空
- 修改DefaultController,如下所示。
- 修改WebApiConfig.cs,如下所示。
- 運行/調試
我想到的是,當我瀏覽到http://localhost:<port>/api/do_stuff
我看到Success!
在根據接受頭(這是我做的),XML或JSON,當我瀏覽到任何其他網頁,我應該看到Failure!
(我沒有)。相反,當我導航到任何其他頁面時,我看到IIS的404響應。
DefaultController.cs:
[RoutePrefix("api")]
public class DefaultController : ApiController
{
[HttpGet]
[Route("do_stuff")]
public String DoStuff()
{
return "Success!";
}
}
WebApiConfig。CS:
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.MapHttpAttributeRoutes();
config.Filters.Add(new CustomExceptionFilter());
}
private class CustomExceptionFilter : ExceptionFilterAttribute
{
public override void OnException(HttpActionExecutedContext actionExecutedContext)
{
if (actionExecutedContext.Response.StatusCode == System.Net.HttpStatusCode.NotFound)
{
actionExecutedContext.Response = new System.Net.Http.HttpResponseMessage(System.Net.HttpStatusCode.NotFound)
{
Content = new StringContent(@"""Failure!"""),
};
}
}
}
}
編輯3
我也試圖加入一個全球性的異常處理程序和異常記錄如下所示: http://www.asp.net/web-api/overview/error-handling/web-api-global-error-handling
無論是當我嘗試瀏覽到一個無效的被稱爲在上例中路由或導航到站點根目錄。
如果接受頭部是text/html的,而不是應用/ JSON然後返回HTML可能是無論如何做正確的事情。 –
我不認爲這個答案在這裏適用,因爲接受頭文件當前被設置爲application/json,但是我得到的是text/html。這意味着我的格式化程序不會因缺少路由和禁止請求而受到尊重。 –
雖然我會檢查你提到的步驟並回復,但是你可以使CustomExceptionFilter成爲一個獨立的公共類,使它成爲一個私有類有什麼意義,我的理解是即使你已經註冊了,它只會用於異常內WebAPIConfig,這就是爲什麼它沒有觸發任何遇到的異常 –