【发布时间】:2021-08-13 14:16:49
【问题描述】:
我想替换中间件中的请求/响应正文。假设如果客户端发送 Hello,我想将其更改为 Hola,并且与响应类似。我找到了有效的代码,但不符合我的要求。我的问题是为什么这个有效而另一个无效。实际上是相同的代码。
工作代码
public async Task InvokeAsync(HttpContext context, RequestDelegate next)
{
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
{
if (originalContent != null)
{
//Master is some model name
var modifiedData = new Master() { Id = "Changed in Middleware", Email = "Changed" };
var json = JsonConvert.SerializeObject(modifiedData);
//json variable is just a string here
//modified stream
var requestData = Encoding.UTF8.GetBytes(json);
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;
await next(context);
}
代码无效,但我的要求
public async Task InvokeAsync(HttpContext context, RequestDelegate next)
{
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
{
if (originalContent != null)
{
var json = "This is just a string as deserializing returns string";
//modified stream
var requestData = Encoding.UTF8.GetBytes(json);
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;
await next(context);
}
所以 工作代码 将更改传递给控制器,并具有值 Id ="Changed in middlware" 和 Email = "changed" em> 但 not working code 没有传递任何东西......在控制器中,参数有 null 而不是 “这只是一个字符串,因为反序列化返回字符串” 值。我知道这不是什么神奇的事情。我错过了什么吗?
【问题讨论】:
-
你确定
originalContent有数据吗? -
@NicolaBiada 是的,在调试器中我可以很容易地看到它有什么...对于对象一和字符串一
标签: c# asp.net-core request httpcontext asp.net-core-middleware