Asp.Net Core 2 中是否有等同于 "HttpContext.Response.Write" 的东西?
Is there an equivalent to "HttpContext.Response.Write" in Asp.Net Core 2?
我正在尝试使用 Asp.Net Core 2 中的 ActionFilter 在页面上附加一些 HTML 和 Javascript 内容。
在 MVC 中,它与
一起工作
filterContext.HttpContext.Response.Write(stringBuilder.ToString());
但在 Core 中它不起作用。
我试着用这个来实现:
filterContext.HttpContext.Response.WriteAsync(stringBuilder.ToString());
但它会使整个页面变成空白。
我正在寻找内置于 Asp.Core 2.0
中的 nopCommerce 4.0 的解决方案
Response.Body.Write 将字节数组作为参数。
public void OnGet() {
var text = "<h1>Hello, Response!</h1>";
byte[] data = System.Text.Encoding.UTF8.GetBytes(text);
Response.Body.Write(data, 0, data.Length);
}
或异步版本:
public async Task OnGetAsync() {
var text = "<h1>Hello, Async Response!</h1>";
byte[] data = System.Text.Encoding.UTF8.GetBytes(text);
await Response.Body.WriteAsync(data, 0, data.Length);
}
你可以试试这样的
在 INopStartup.Configure(IApplicationBuilder 应用程序)的自定义实现中
application.Use(async (context, next) =>
{
using (var customStream = new MemoryStream())
{
// Create a backup of the original response stream
var backup = context.Response.Body;
// Assign readable/writeable stream
context.Response.Body = customStream;
await next();
// Restore the response stream
context.Response.Body = backup;
// Move to start and read response content
customStream.Seek(0, SeekOrigin.Begin);
var content = new StreamReader(customStream).ReadToEnd();
// Write custom content to response
await context.Response.WriteAsync(content);
}
});
并且比您的自定义 ResultFilterAttribute
public class MyAttribute : ResultFilterAttribute
{
public override void OnResultExecuted(ResultExecutedContext context)
{
try
{
var bytes = Encoding.UTF8.GetBytes("Foo Bar");
// Seek to end
context.HttpContext.Response.Body.Seek(context.HttpContext.Response.Body.Length, SeekOrigin.Begin);
context.HttpContext.Response.Body.Write(bytes, 0, bytes.Length);
}
catch
{
// ignored
}
base.OnResultExecuted(context);
}
}
结果
希望这有助于进入正确的道路。
静态和异步方法 HttpResponseWritingExtensions.WriteAsync
是目前实现此目标的首选方法。
目前,您可以在程序集Microsoft.AspNetCore.Http.Abstractions
中找到它。
using Microsoft.AspNetCore.Http;
[HttpGet("test")]
public async Task GetTest()
=> await HttpResponseWritingExtensions.WriteAsync(this.Response, "Hello World");
更新 2022-02-23
和主题有点关系。使用 ASP.NET Core 6.0,您可以使用 Minimal API 编写一个简单的响应,如下所示:
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet("/", () => "Hello World");
app.Run();
我的代码没有为异步执行做好准备,所以我使用了:
Response.WriteAsync("text").Wait();
.Wait() 使执行等待异步方法完成执行以继续。
不知道性能是不是最好的,但已经比.Net Framework方案好
.等待(): https://docs.microsoft.com/pt-br/dotnet/api/system.io.stream.writeasync?view=net-6.0
.WriteAsync(): https://docs.microsoft.com/pt-br/dotnet/api/system.threading.tasks.task.wait?view=net-6.0
我正在尝试使用 Asp.Net Core 2 中的 ActionFilter 在页面上附加一些 HTML 和 Javascript 内容。
在 MVC 中,它与
一起工作 filterContext.HttpContext.Response.Write(stringBuilder.ToString());
但在 Core 中它不起作用。
我试着用这个来实现:
filterContext.HttpContext.Response.WriteAsync(stringBuilder.ToString());
但它会使整个页面变成空白。
我正在寻找内置于 Asp.Core 2.0
中的 nopCommerce 4.0 的解决方案Response.Body.Write 将字节数组作为参数。
public void OnGet() {
var text = "<h1>Hello, Response!</h1>";
byte[] data = System.Text.Encoding.UTF8.GetBytes(text);
Response.Body.Write(data, 0, data.Length);
}
或异步版本:
public async Task OnGetAsync() {
var text = "<h1>Hello, Async Response!</h1>";
byte[] data = System.Text.Encoding.UTF8.GetBytes(text);
await Response.Body.WriteAsync(data, 0, data.Length);
}
你可以试试这样的
在 INopStartup.Configure(IApplicationBuilder 应用程序)的自定义实现中
application.Use(async (context, next) =>
{
using (var customStream = new MemoryStream())
{
// Create a backup of the original response stream
var backup = context.Response.Body;
// Assign readable/writeable stream
context.Response.Body = customStream;
await next();
// Restore the response stream
context.Response.Body = backup;
// Move to start and read response content
customStream.Seek(0, SeekOrigin.Begin);
var content = new StreamReader(customStream).ReadToEnd();
// Write custom content to response
await context.Response.WriteAsync(content);
}
});
并且比您的自定义 ResultFilterAttribute
public class MyAttribute : ResultFilterAttribute
{
public override void OnResultExecuted(ResultExecutedContext context)
{
try
{
var bytes = Encoding.UTF8.GetBytes("Foo Bar");
// Seek to end
context.HttpContext.Response.Body.Seek(context.HttpContext.Response.Body.Length, SeekOrigin.Begin);
context.HttpContext.Response.Body.Write(bytes, 0, bytes.Length);
}
catch
{
// ignored
}
base.OnResultExecuted(context);
}
}
结果
希望这有助于进入正确的道路。
静态和异步方法 HttpResponseWritingExtensions.WriteAsync
是目前实现此目标的首选方法。
目前,您可以在程序集Microsoft.AspNetCore.Http.Abstractions
中找到它。
using Microsoft.AspNetCore.Http;
[HttpGet("test")]
public async Task GetTest()
=> await HttpResponseWritingExtensions.WriteAsync(this.Response, "Hello World");
更新 2022-02-23
和主题有点关系。使用 ASP.NET Core 6.0,您可以使用 Minimal API 编写一个简单的响应,如下所示:
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet("/", () => "Hello World");
app.Run();
我的代码没有为异步执行做好准备,所以我使用了:
Response.WriteAsync("text").Wait();
.Wait() 使执行等待异步方法完成执行以继续。
不知道性能是不是最好的,但已经比.Net Framework方案好
.等待(): https://docs.microsoft.com/pt-br/dotnet/api/system.io.stream.writeasync?view=net-6.0
.WriteAsync(): https://docs.microsoft.com/pt-br/dotnet/api/system.threading.tasks.task.wait?view=net-6.0