亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何從 Invoke 方法返回 BadRequestObjectResult

如何從 Invoke 方法返回 BadRequestObjectResult

C#
慕少森 2022-12-24 13:59:14
我正在開發一個 API,它最初驗證來自 https 請求的 Accept 標頭,然后通過中間件進行響應。我已經在 Invoke 方法中添加了驗證 Accept 標頭的邏輯,如圖所示,如果驗證結果(字符串比較)為假,我如何返回錯誤的請求對象。//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(當驗證失敗時)作為響應,但我得到 200 OK 響應和空白響應正文。
查看完整描述

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標頭有一個非常具體的用例,用于內容協商。這意味著當您將其設置為某種自定義內容類型時,服務器將返回具有此類內容類型的結果。將它用于授權目的并不適合這里。


查看完整回答
反對 回復 2022-12-24
  • 1 回答
  • 0 關注
  • 202 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號