1

私はMVC 2.Asp.Net Core 2に "HttpContext.Response.Write"と同等のものがありますか?

Asp.NetコアでのActionFilterを使用してページ上のいくつかのHTMLとJavascriptのコンテンツを追加しようとしている、それは

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

で作業していますが、コアにそれが動作していません。

私はこれを実装してみました:

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

しかし、それは空白に完全なページを作ります。

私はAsp.Core 2.0でビルドしたnopCommerce 4.0のためのソリューションを探しています

答えて

0

あなたは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); 
    } 
} 

そして結果

Result HTML

が、これは正しい道に入るためにお役に立てば幸いです。

+0

ありがとうございました。うまくいきます(Y) –

+0

このソリューションをnopCommerceで使用すると、問題が発生しています。 _INopStartup.Configure_メソッドでは、** await next()**を最初に呼び出してから**レスポンスストリーム**を復元すると、ユーザー側で画像とスクリプトが読み込まれず、エラーが返されます** Response Content-Length不一致:書き込まれたバイト数が多すぎます** 最初に応答ストリームを復元してからnext()を呼び出すと、** filterContext.HttpContext.Response.Body.Seek()メソッドが見つかりませんでした**。 –

2

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

Response.Body.Writeは、ページ応答 '@ * @sectionスクリプト{{のawait Html.RenderPartialAsync( "_ ValidationScriptsPartial")@ を引き継ぐために、かみそりのページから私たちのデフォルトのコンテンツを削除したり、コメントすることを確認してください;} } * @ ' – dragansr

関連する問題