【问题标题】:How to modify request/response in httpcontext in the middleware of asp.net core?如何在asp.net core的中间件中修改httpcontext中的request/response?
【发布时间】:2021-08-09 09:26:31
【问题描述】:

要求是读取中间件中的请求并更改其内容,然后传递给控制器​​。以及控制器发送的响应,需要读取和修改,然后进一步传递给管道中的其他中间件。

传入的数据是加密的 base64 字符串,在MyMiddleware 中,我将解密内容并将其传递给控制器​​,并且对于响应它将是相同的。在响应中,它将加密数据。数据内容类型为application.json

所以这是我找到的一段代码,但它不起作用。

调用函数

public async Task InvokeAsync(HttpContext context, RequestDelegate next)
{

            await ModifyRequest(context);
            await next(context);
            await ModifyResponse(context);

}

请求

public async Task ModifyRequest(HttpContext  context)
{
            var request = context.Request;
            var stream = request.Body;// currently holds the original stream                    
            var originalReader = new StreamReader(stream);
            var originalContent = await originalReader.ReadToEndAsync();
            var notModified = true;
            try
            {
                //decrypting the data
                var dataSource = Decrypt(originalContent);

                if (dataSource != null)
                {
                    //modified stream
                    var requestData = Encoding.UTF8.GetBytes(dataSource);
                    stream = new MemoryStream(requestData);
                    notModified = false;
                }
            }
            catch(Exception e)
            {
                Console.WriteLine(e.Message);
            }
            if (notModified)
            {
                //putting original data
                var requestData = Encoding.UTF8.GetBytes(originalContent);
                stream = new MemoryStream(requestData);
            }

            request.Body = stream; 
}

回应

public async Task ModifyResponse(HttpContext  context)
{
            var originalResponseStream = context.Response.Body;

            using (var ms = new MemoryStream())
            {
                context.Response.Body = ms;
                /*
                await next(context);
               //this line of code was there when there is no seperate func for request and response
              */

                ms.Position = 0;
                var responseReader = new StreamReader(ms);

                var responseContent = responseReader.ReadToEnd();
                Console.WriteLine($"PlainResponse Body: {responseContent}");

                var encryptedResponse = Encrypt(responseContent);
                var byteData = Encoding.UTF8.GetBytes(encryptedResponse);
                await ms.WriteAsync(byteData, 0 , byteData.Length);

                ms.Position = 0;

                await ms.CopyToAsync(originalResponseStream);
                context.Response.Body = originalResponseStream;
            }
}

上面的代码不起作用。一个不是将内容发送到控制器,另一个不是在上下文中编写它。请帮忙

【问题讨论】:

  • 您是如何注册中间件的?何时注册?
  • @SebastianGrunow 在启动文件中app.UseMiddleware<MyMiddleware>()app.Authorization() 之后和app.Endpoints() 之前...也在配置服务中,我添加了services.AddSingleton<MyMiddleware>()
  • 根据Microsoft docs,您需要一个实现Invoke 方法的类。不过,您不需要将其注册为服务。
  • @SebastianGrunow 所以如果我删除services.AddSingleton<MyMiddleware>() ...它会工作吗?
  • 我不能告诉你,因为我没有你的启动和中间件的完整代码。请遵循文档或提供有关您的课程的更多信息。

标签: c# asp.net-core middleware


【解决方案1】:

我没有足够的声誉来发表评论,我希望这就足够了。

这完全取决于您发送正文的方式以及您的应用程序如何解释它。

  • 您使用什么内容类型发送请求?
  • 读取正文流时,您会得到什么结果?
  • 这是您寻找的结果吗?

假设您使用 application/json 内容类型并且您正在发送 base64 加密对象。首先,您必须从原始内容中提取对象的 base64 字符串,解密,将其转换为 json(如果还没有),然后将其作为流读取并传递给正文。

'

【讨论】:

    猜你喜欢
    • 2019-04-11
    • 1970-01-01
    • 2020-08-03
    • 1970-01-01
    • 2020-09-22
    • 2018-05-17
    • 2019-07-15
    • 2018-12-24
    • 2015-09-23
    相关资源
    最近更新 更多