1 回答

TA貢獻1818條經驗 獲得超3個贊
這些IActionResult類型僅在 MVC 管道中使用。作為該管道的一部分,來自操作或 MVC 篩選器的結果對象隨后被執行以創建對HttpResponse對象的實際響應。
然而,這意味著您實際上不能在 MVC 管道之外使用操作結果對象。因此,如果您有自定義中間件,您將無法使用這些結果,因為它們不會被 MVC 管道處理(從技術上講,您可以自己執行結果,但我不建議這樣做)。
因此,您必須自己設置結果。如果您只想設置一些(失?。顟B代碼,那很容易做到:
public async Task<ObjectResult> Invoke(HttpContext context)
{
bool result = context.Request.Headers["Accept"].ToString() == "app/version.abc-ghi-api.v";
if (result)
{
await _next(context);
}
else
{
context.Result.StatusCode = 500;
}
}
如果你想包含一個主體,那么它會變得有點復雜,因為你現在必須寫入輸出流,這也意味著你首先必須正確地序列化你的輸出。
因此,與其在自定義中間件中執行此操作,我建議您在 MVC 過濾器中執行此操作。如上所述,過濾器作為 MVC 管道的一部分運行,因此它們僅與 MVC 中間件一起運行。這意味著您將無法以這種方式保護您的靜態文件——但通常這沒什么大不了的。
在您的情況下,由于您想通過 HTTP 標頭授權客戶端,我建議您創建一個授權過濾器:
public class AcceptHeaderAuthorizationFilter : IAuthorizationFilter
{
public void OnAuthorization(AuthorizationFilterContext context)
{
bool result = context.HttpContext.Request.Headers["Accept"].ToString() == "app/version.abc-ghi-api.v";
if (!result)
{
var result = new Error.GenerateErrorMessage("Accept header validation failed", Log.Logger);
context.Result = result;
}
}
}
這現在使用 MVC 管道,因此您可以使用IActionResult對象。由于您在授權過濾器中設置了結果,因此您也將剩余的管道短路,因此之后不會執行任何操作。執行將停止并立即產生您的結果。
最后一點:Accept標頭有一個非常具體的用例,用于內容協商。這意味著當您將其設置為某種自定義內容類型時,服務器將返回具有此類內容類型的結果。將它用于授權目的并不適合這里。
- 1 回答
- 0 關注
- 202 瀏覽
添加回答
舉報