web-dev-qa-db-ja.com

Asp.Net Core 2の「HttpContext.Response.Write」に相当するものはありますか?

Asp.Net Core 2のActionFilterを使用して、ページにいくつかのHTMLおよびJavaScriptコンテンツを追加しようとしています。

MVCでは、

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

しかし、コアでは機能しません。

私はこれで実装しようとしました:

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

しかしそれは完全なページを空白にする。

Asp.Core 2.0に組み込まれているnopCommerce 4.0のソリューションを探しています

6
Raju Paladiya

あなたはこのようなものを試すことができます

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);
    }
});

そしてあなたのカスタムよりも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);
    }
}

そしてその結果

Result HTML

これが正しい方法に入るのに役立つことを願っています。

4
Raphael

静的および非同期メソッド HttpResponseWritingExtensions.WriteAsync は現在、この目標を達成するための推奨される方法です。

現在、アセンブリアセンブリMicrosoft.AspNetCore.Http.Abstractions

using Microsoft.AspNetCore.Http;

[HttpGet("test")]
public async Task GetTest()
    => await HttpResponseWritingExtensions.WriteAsync(this.Response, "Hello World");
10
WoIIe

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);
}
1
dragansr