问题
I'm trying to append some HTML and Javascript content on page using ActionFilter in Asp.Net Core 2.
In MVC, it's working with
filterContext.HttpContext.Response.Write(stringBuilder.ToString());
but in Core it not working.
I tried to implement with this:
filterContext.HttpContext.Response.WriteAsync(stringBuilder.ToString());
But it make complete page to blank.
I'm looking solution for nopCommerce 4.0 which build in Asp.Core 2.0
回答1:
You can try something like this
In a custom implementation of INopStartup.Configure(IApplicationBuilder application)
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);
}
});
And than in your custom 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);
}
}
And the result
Hope this helps to get into the right way.
回答2:
The static and asynchronous method HttpResponseWritingExtensions.WriteAsync is currently the preferred way of reaching this goal.
Currently, you can find it in the assembly Assembly Microsoft.AspNetCore.Http.Abstractions
.
using Microsoft.AspNetCore.Http;
[HttpGet("test")]
public async Task GetTest()
=> await HttpResponseWritingExtensions.WriteAsync(this.Response, "Hello World");
回答3:
Response.Body.Write takes a byte array as an argument.
public void OnGet() {
var text = "<h1>Hello, Response!</h1>";
byte[] data = System.Text.Encoding.UTF8.GetBytes(text);
Response.Body.Write(data, 0, data.Length);
}
or async version:
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);
}
来源:https://stackoverflow.com/questions/47350368/is-there-an-equivalent-to-httpcontext-response-write-in-asp-net-core-2