相关疑难解决方法(0)

如何阅读ASP.NET Core Response.Body?

我一直在努力Response.Body从ASP.NET核心操作中获取属性,而我能够识别的唯一解决方案似乎不是最佳的.该解决方案需要Response.Body在一段MemoryStream时间内将流读取到字符串变量中,然后在发送到客户端之前将其交换回来.在下面的示例中,我试图Response.Body在自定义中间件类中获取值. Response.Body是一个在ASP.NET核心出于某种原因唯一的财产?我在这里遗漏了什么,或者这是一个疏忽/错误/设计问题?有更好的阅读方式Response.Body吗?

当前(次优)解决方案:

public class MyMiddleWare
{
    private readonly RequestDelegate _next;

    public MyMiddleWare(RequestDelegate next)
    {
        _next = next;
    }

    public async Task Invoke(HttpContext context)
    {
        using (var swapStream = new MemoryStream())
        {
            var originalResponseBody = context.Response.Body;

            context.Response.Body = swapStream;

            await _next(context);

            swapStream.Seek(0, SeekOrigin.Begin);
            string responseBody = new StreamReader(swapStream).ReadToEnd();
            swapStream.Seek(0, SeekOrigin.Begin);

            await swapStream .CopyToAsync(originalResponseBody);
            context.Response.Body = originalResponseBody;
        }
    }
}  
Run Code Online (Sandbox Code Playgroud)

尝试使用EnableRewind()的解决方案: 这仅适用于Request.Body,而不是Response.Body.这导致从而Response.Body不是实际的响应主体内容中读取空字符串. …

c# asp.net-core-mvc asp.net-core asp.net-core-middleware

52
推荐指数
5
解决办法
3万
查看次数

读取请求正文两次

我试图在中间件中读取正文以进行身份​​验证,但是当请求到达api控制器时,对象是空的,因为正在读取正文.有没有办法解决.我正在中间件中读这样的身体.

var buffer = new byte[ Convert.ToInt32( context.Request.ContentLength ) ];
await context.Request.Body.ReadAsync( buffer, 0, buffer.Length );
var body = Encoding.UTF8.GetString( buffer );
Run Code Online (Sandbox Code Playgroud)

asp.net-core-mvc asp.net-core asp.net-core-webapi

19
推荐指数
2
解决办法
1万
查看次数

阅读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);
}
Run Code Online (Sandbox Code Playgroud)

并在ActionFilter的OnExcecuted方法中如下所示:

_request = context.HttpContext.Request.ReadAsString().Result;
_response = context.HttpContext.Response.ReadAsString().Result; //?
Run Code Online (Sandbox Code Playgroud)

我试图在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;
 }
Run Code Online (Sandbox Code Playgroud)

但是,没有结果!

如何在OnActionExcecuted中获得响应?

谢谢大家花时间尝试帮助解释

asp.net asp.net-mvc .net-core asp.net-core

7
推荐指数
3
解决办法
3208
查看次数