第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

如何從 Invoke 方法返回 BadRequestObjectResult

如何從 Invoke 方法返回 BadRequestObjectResult

C#
慕少森 2022-12-24 13:59:14
我正在開發(fā)一個(gè) API,它最初驗(yàn)證來自 https 請(qǐng)求的 Accept 標(biāo)頭,然后通過中間件進(jìn)行響應(yīng)。我已經(jīng)在 Invoke 方法中添加了驗(yàn)證 Accept 標(biāo)頭的邏輯,如圖所示,如果驗(yàn)證結(jié)果(字符串比較)為假,我如何返回錯(cuò)誤的請(qǐng)求對(duì)象。//Invoke method public async Task<ObjectResult> Invoke(HttpContext context){   bool result = context.Request.Headers["Accept"].ToString() ==    "app/version.abc-ghi-api.v";   if (result == true)   {     await  _next(context);      }   ObjectResult objectResult = await    Error.GenerateErrorMessage("Accept header validation    failed", Log.Logger);   return objectResult;  }//Error classpublic class Error{    public async static Task<ObjectResult> Error(string message, logger log)    {       //logic for creating the payload       return new BadRequestObjectResult(errorMessagePayload)    }}//Startup class configure methodpublic void Configure(IApplicationBuilder app, IHostingEnvironment env){     app.UseMiddleware<AcceptHeaderMiddleware>();     if (env.IsDevelopment())     {            app.UseDeveloperExceptionPage();     }     else     {                   app.UseHsts();     }     app.UseMvc();}我期待 badObjectResult(當(dāng)驗(yàn)證失敗時(shí))作為響應(yīng),但我得到 200 OK 響應(yīng)和空白響應(yīng)正文。
查看完整描述

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)目的并不適合這里。


查看完整回答
反對(duì) 回復(fù) 2022-12-24
  • 1 回答
  • 0 關(guān)注
  • 189 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)