Asp.net

在 ActionFilterAttribute 中讀取 Asp.Net Core Response 正文

  • April 30, 2019

我使用 Asp.Net Core 作為 Rest Api 服務。我需要訪問 ActionFilter 中的請求和響應。實際上,我在 OnActionExcecuted 中找到了請求,但我無法讀取響應結果。

我試圖返回值如下:

[HttpGet]
[ProducesResponseType(typeof(ResponseType), (int)HttpStatusCode.OK)]
[Route("[action]")]
public async Task<IActionResult> Get(CancellationToken cancellationToken)
{
   var model = await _responseServices.Get(cancellationToken);
   return Ok(model);
}

並在 ActionFilter OnExcecuted 方法中如下:

_request = context.HttpContext.Request.ReadAsString().Result;
_response = context.HttpContext.Response.ReadAsString().Result; //?

我正在嘗試將 ReadAsString 中的響應作為擴展方法獲取,如下所示:

public static async Task<string> ReadAsString(this HttpResponse response)
{
    var initialBody = response.Body;
    var buffer = new byte[Convert.ToInt32(response.ContentLength)];
    await response.Body.ReadAsync(buffer, 0, buffer.Length);
    var body = Encoding.UTF8.GetString(buffer);
    response.Body = initialBody;
    return body;
}

但是,沒有結果!

如何在 OnActionExcecuted 中獲得響應?

謝謝大家花時間嘗試幫助解釋

我知道已經有了答案,但我還想補充一點,問題是 MVC 管道Response.Body在執行時沒有填充,ActionFilter因此您無法訪問它。由Response.BodyMVC 填充middleware

如果您想閱讀,Response.Body那麼您需要創建自己的自定義中間件以在填充 Response 對象時攔截呼叫。有許多網站可以向您展示如何做到這一點。一個例子是here

正如在另一個答案中所討論的,如果您想這樣做,ActionFilter您可以使用context.Result來訪問資訊。

你也可以做…

string response = "Hello";
if (result is ObjectResult objectResult)
       {
           var status = objectResult.StatusCode;
           var value = objectResult.Value;
           var stringResult = objectResult.ToString();
           responce = (JsonConvert.SerializeObject(value));
       }

我在 .net 核心應用程序中使用了它。

希望能幫助到你。

引用自:https://stackoverflow.com/questions/53626497