1 回答

TA貢獻(xiàn)1818條經(jīng)驗(yàn) 獲得超3個(gè)贊
這些IActionResult類型僅在 MVC 管道中使用。作為該管道的一部分,來自操作或 MVC 篩選器的結(jié)果對(duì)象隨后被執(zhí)行以創(chuàng)建對(duì)HttpResponse對(duì)象的實(shí)際響應(yīng)。
然而,這意味著您實(shí)際上不能在 MVC 管道之外使用操作結(jié)果對(duì)象。因此,如果您有自定義中間件,您將無法使用這些結(jié)果,因?yàn)樗鼈儾粫?huì)被 MVC 管道處理(從技術(shù)上講,您可以自己執(zhí)行結(jié)果,但我不建議這樣做)。
因此,您必須自己設(shè)置結(jié)果。如果您只想設(shè)置一些(失敗)狀態(tài)代碼,那很容易做到:
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;
}
}
如果你想包含一個(gè)主體,那么它會(huì)變得有點(diǎn)復(fù)雜,因?yàn)槟悻F(xiàn)在必須寫入輸出流,這也意味著你首先必須正確地序列化你的輸出。
因此,與其在自定義中間件中執(zhí)行此操作,我建議您在 MVC 過濾器中執(zhí)行此操作。如上所述,過濾器作為 MVC 管道的一部分運(yùn)行,因此它們僅與 MVC 中間件一起運(yùn)行。這意味著您將無法以這種方式保護(hù)您的靜態(tài)文件——但通常這沒什么大不了的。
在您的情況下,由于您想通過 HTTP 標(biāo)頭授權(quán)客戶端,我建議您創(chuàng)建一個(gè)授權(quán)過濾器:
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;
}
}
}
這現(xiàn)在使用 MVC 管道,因此您可以使用IActionResult對(duì)象。由于您在授權(quán)過濾器中設(shè)置了結(jié)果,因此您也將剩余的管道短路,因此之后不會(huì)執(zhí)行任何操作。執(zhí)行將停止并立即產(chǎn)生您的結(jié)果。
最后一點(diǎn):Accept標(biāo)頭有一個(gè)非常具體的用例,用于內(nèi)容協(xié)商。這意味著當(dāng)您將其設(shè)置為某種自定義內(nèi)容類型時(shí),服務(wù)器將返回具有此類內(nèi)容類型的結(jié)果。將它用于授權(quán)目的并不適合這里。
- 1 回答
- 0 關(guān)注
- 189 瀏覽
添加回答
舉報(bào)