【发布时间】: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