Asp.net
在 ActionFilterAttribute 中讀取 Asp.Net Core Response 正文
我使用 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 核心應用程序中使用了它。
希望能幫助到你。