Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net core 3.1 ASP.NET核心响应正文的前缀文本_Asp.net Core 3.1_.net 5 - Fatal编程技术网

Asp.net core 3.1 ASP.NET核心响应正文的前缀文本

Asp.net core 3.1 ASP.NET核心响应正文的前缀文本,asp.net-core-3.1,.net-5,Asp.net Core 3.1,.net 5,我正在尝试将字符串)]}'预先添加到任何JSON响应体中。我原以为我需要使用IAsyncResultFilter,但我运气不好。如果我使用下面的代码,它会将文本追加到响应中,因为调用wait next()会写入响应管道。但是,如果我在这之前尝试查看上下文,我无法说出响应是什么,以知道它是否是JSON 公共类JsonPrefixFilter:IAsyncResultFilter { ResultExecutionAsync上的公共异步任务(ResultExecutionContext,Result

我正在尝试将字符串
)]}'预先添加到任何JSON响应体中。我原以为我需要使用
IAsyncResultFilter
,但我运气不好。如果我使用下面的代码,它会将文本追加到响应中,因为调用
wait next()
会写入响应管道。但是,如果我在这之前尝试查看上下文,我无法说出响应是什么,以知道它是否是JSON

公共类JsonPrefixFilter:IAsyncResultFilter
{
ResultExecutionAsync上的公共异步任务(ResultExecutionContext,ResultExecutionDelegate next)
{
var executed=wait next();
var response=executed.HttpContext.response;
if(response.ContentType==null | |!response.ContentType.StartsWith(“应用程序/json”))
返回;
var prefix=Encoding.UTF8.GetBytes(“)]}',\\n“;
var bytes=新的只读内存(前缀);
wait response.BodyWriter.WriteAsync(字节);
}
}
你可以用蒸汽倒带它。问题是,您只能继续添加到默认的HttpResponseStream,它不支持查找。 因此,您可以从中使用该技术,并将其临时替换为
MemoryStream

private Stream ReplaceBody(HttpResponse响应)
{
var originBody=response.Body;
response.Body=newmemoryStream();
返回原始体;
}
专用异步任务ReturnBodyAsync(HttpResponse响应,流原始体)
{
response.Body.Seek(0,SeekOrigin.Begin);
等待响应。Body.CopyToAsync(原始Body);
响应。主体=原始主体;
}
ResultExecutionAsync上的公共异步任务(ResultExecutionContext,ResultExecutionDelegate next)
{
var originalBody=ReplaceBody(context.HttpContext.Response);//用MemoryStream替换默认流
wait next();//我们可能不关心这个调用的返回。它都在上下文中
var response=context.HttpContext.response;
if(response.ContentType==null | |!response.ContentType.StartsWith(“应用程序/json”))
返回;
var prefix=Encoding.UTF8.GetBytes(“)]}',\\n“;
var bytes=新的只读内存(前缀);
response.Body.Seek(0,SeekOrigin.Begin);//现在你可以找了。但是您会注意到它会覆盖响应,因此您可能需要在缓冲区中留出额外的空间
wait response.BodyWriter.WriteAsync(字节);
等待ReturnBodyAsync(context.HttpContext.Response,originalBody);//还原引用,将数据复制到默认流并返回它
}
由于需要恢复对原始流的引用,这一点变得更加复杂,因此必须小心处理


有更多的背景。

多亏帖木儿的帖子,我才想出了这个可行的解决方案

公共类JsonPrefixFilter:IAsyncResultFilter
{
ResultExecutionAsync上的公共异步任务(ResultExecutionContext,ResultExecutionDelegate next)
{
var response=context.HttpContext.response;
//ASP.NET核心将始终将原始正文流的内容发送回客户端。
var originalBody=响应。Body;
//我们现在希望写入内存流,而不是实际的响应体。
var ms=新内存流();
响应。Body=ms;
//在这个调用之后,主体被写入内存流和属性中
//将填充响应对象的。
等待下一个();
if(response.ContentType!=null&&response.ContentType.StartsWith(“application/json”)){
var prefix=Encoding.UTF8.GetBytes(“)]}',\\n“;
var prefixMemoryStream=new MemoryStream();
等待prefixMemoryStream.WriteAsync(前缀);
等待prefixMemoryStream.WriteAsync(ms.ToArray());
prefixMemoryStream.Seek(0,SeekOrigin.Begin);
//现在将.NET想要使用的流放回原处,并将内存流复制到其中。
响应。主体=原始主体;
等待prefixMemoryStream.CopyToAsync(response.Body);
}否则{
//如果不是JSON,就不要弄乱流,所以把东西放回去。
响应。主体=原始主体;
Seek女士(0,SeekOrigin.Begin);
等待ms.CopyToAsync(response.Body);
}
}
}

谢谢!这实际上并没有按原样工作,但根据这个答案和你指给我的另一个答案,我能够使它工作。一旦这样,让我来奖励赏金,我会给你的。