以往進行 web site project 開發時,都是由後端 call api,判斷 HTTP status code 做相應的處理後,再丟到前端顯示。
前陣子改成由後端 call api 之後直接將 response 丟到前端,由前端判斷 HTTP status code 做相對應的處理。
結果發現當 status code 為 400 時,在前端總是抓不到我預期中的 response,但是 200 就可以抓的到,400 完全不知道消失到哪裡去了!!!
查了一下發現是被 IIS 吃掉了,因為 IIS 針對特定的 HTTP status code (400、403.9、411、414、500、500.11、500.14、500.15、501、503 和 505)有預設的錯誤訊息。
如果希望客製化錯誤訊息,需要在後端加入下列的 code,這樣前台就可以拿的到
Response.TrySkipIisCustomErrors = true;
我還有看到另外一種解法是加在 web.config,這個我沒有嘗試,因為加在 web.config 會影響到整個專案,而我只是特定的頁面需要客製化錯誤訊息而已。
<configuration>
<system.webServer>
<httpErrors existingResponse="PassThrough" />
</system.webServer>
</configuration>
參考資料:
https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2008-R2-and-2008/cc753103(v=ws.10)
https://stackoverflow.com/questions/9985327/asp-net-web-api-httpresponseexception-400-bad-request-hijacked-by-iis
https://stackoverflow.com/questions/268592/custom-error-page-configured-in-iis-for-code-400-bad-request-is-ignored
https://weblog.west-wind.com/posts/2017/jun/01/bypassing-iis-error-messages-in-aspnet