【发布时间】:2018-04-21 05:42:03
【问题描述】:
我有一个简单的控制器动作,如下所示:
public Task<IEnumerable<Data>> GetData()
{
IEnumerable<Data> data = new List<Data>();
return data;
}
我希望能够从中间件中检查返回值,以便 JSON 看起来像
{
"data": [
],
"apiVersion": "1.2",
"otherInfoHere": "here"
}
所以我的有效载荷总是在data 内。我知道我可以在控制器级别做到这一点,但我不想在每一个动作上都这样做。我宁愿在中间件中一劳永逸。
这是我的中间件的一个例子:
public class NormalResponseWrapper
{
private readonly RequestDelegate next;
public NormalResponseWrapper(RequestDelegate next)
{
this.next = next;
}
public async Task Invoke(HttpContext context)
{
var obj = context;
// DO something to get return value from obj
// Create payload and set data to return value
await context.Response.WriteAsync(/*RETURN NEW PAYLOAD HERE*/);
}
有什么想法吗?
现在得到了价值,但返回它已经太晚了
try
{
using (var memStream = new MemoryStream())
{
context.Response.Body = memStream;
await next(context);
memStream.Position = 0;
object responseBody = new StreamReader(memStream).ReadToEnd();
memStream.Position = 0;
await memStream.CopyToAsync(originalBody);
// By now it is to late, above line sets the value that is going to be returned
await context.Response.WriteAsync(new BaseResponse() { data = responseBody }.toJson());
}
}
finally
{
context.Response.Body = originalBody;
}
【问题讨论】:
-
看看这个,看看它是否适用stackoverflow.com/questions/43403941/…
-
这样我就得到了数据,但是当我操作它并尝试返回它时为时已晚
-
这有内存问题的风险吗?
-
与大型有效负载相关的正常问题没有任何问题。请注意,这种方法不适用于流式传输。
-
这是迄今为止我发现的最佳实现的链接:vmsdurano.com/…
标签: c# .net-core middleware httpcontext