Есть ли эквивалент HttpContext.Response.Write в Asp.Net Core 2?

Я пытаюсь добавить некоторый контент HTML и Javascript на страницу, используя ActionFilter в Asp.Net Core 2.

В MVC он работает с

 filterContext.HttpContext.Response.Write(stringBuilder.ToString());

но в ядре это не работает.

Я попытался реализовать это:

filterContext.HttpContext.Response.WriteAsync(stringBuilder.ToString());

Но это делает полную страницу пустой.

Я ищу решение для nopCommerce 4.0, которое встроено в Asp.Core 2.0.


person Raju Paladiya    schedule 17.11.2017    source источник


Ответы (3)


Вы можете попробовать что-то вроде этого

В пользовательской реализации 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);
    }
}

И результат

Результат HTML

Надеюсь, это поможет встать на правильный путь.

person Raphael    schedule 18.11.2017
comment
Если мы используем это решение в nopCommerce, у нас возникнут проблемы. В методе INopStartup.Configure, если мы сначала вызовем await next(), а затем восстановим поток ответов, он не будет загружать изображения и сценарии на На стороне пользователя и выдает ошибку Несоответствие длины ответа: слишком много записанных байтов. Если мы сначала восстановим поток ответа, а затем вызовем await next(), то это выдаст ошибку в filterContext.HttpContext Метод .Response.Body.Seek() не найден. - person Raju Paladiya; 20.11.2017

Статический и асинхронный метод HttpResponseWritingExtensions.WriteAsync в настоящее время является предпочтительным способом достижения этой цели.

В настоящее время вы можете найти его в сборке Сборка Microsoft.AspNetCore.Http.Abstractions.

using Microsoft.AspNetCore.Http;

[HttpGet("test")]
public async Task GetTest()
    => await HttpResponseWritingExtensions.WriteAsync(this.Response, "Hello World");
person WΩLLE - ˈvɔlə    schedule 02.02.2019

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);
}
person dragansr    schedule 18.11.2017
comment
Обязательно удалите или прокомментируйте наш контент по умолчанию со страницы бритвы, поскольку Response.Body.Write берет на себя ответ страницы ` @* @section Scripts { @{await Html.RenderPartialAsync(_ValidationScriptsPartial);} } *@` - person dragansr; 19.11.2017