2017-11-17 102 views
1

내가 MVC 2.Asp.Net Core 2에 "HttpContext.Response.Write"와 동일한 기능이 있습니까?

Asp.Net 코어에 ActionFilter를 사용하여 페이지에 일부 HTML과 자바 스크립트의 내용을 추가하기 위해 노력하고있어, 그것은

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_ 메소드에서 ** 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 스크립트 {@ 을 {Html.RenderPartialAsync ("_ ValidationScriptsPartial")을 기다리고;} } * @' – dragansr