【问题标题】:Modifying the raw html output from MVC 6修改 MVC 6 的原始 html 输出
【发布时间】:2014-12-12 21:54:51
【问题描述】:

像 webmarkupmin 这样的插件使用这样的 HTTP 模块从 HTTPContext 修改 HTTP 响应正文:

protected override void ProcessContent(HttpContext context)
    {
        HttpRequest request = context.Request;
        HttpResponse response = context.Response;
        Encoding encoding = response.ContentEncoding;
        string contentType = response.ContentType;

        if (request.HttpMethod == "GET" && response.StatusCode == 200
            && contentType == ContentType.Html
            && context.CurrentHandler != null)
        {
            var htmlMinifier = WebMarkupMinContext.Current.Markup.CreateHtmlMinifierInstance();
            response.Filter = new HtmlMinificationFilterStream(response.Filter, htmlMinifier,
                request.RawUrl, encoding);

            if (WebMarkupMinContext.Current.IsCopyrightHttpHeadersEnabled())
            {
                CopyrightHelper.AddHtmlMinificationPoweredByHttpHeader(response);
            }
        }
    }

您将如何使用 ASP.NET 5 中的新 HTTP 管道修改每个请求的原始 HTTP 响应正文?

【问题讨论】:

  • 应该添加这个:通过修改我的意思是读出响应正文作为字符串以便可以修改,然后将新内容设置为要发送的响应正文。
  • 奇怪,好像 Response.Body.CanRead 属性不可设置...

标签: asp.net-core asp.net-core-mvc


【解决方案1】:

我认为下面的例子会帮助你。我认为在 ASP.net 5 中我们必须遵循 OWIN 风格的管道。

这是来自 Startup.cs 的一些示例代码

 app.Use(async (context, next) =>
    {
        // Wrap and buffer response body.
        // Expect built in support for this at some point. The current code is prerelease
        var buffer = new MemoryStream();
        var stream = context.Response.Body;
        context.Response.Body = buffer;

        await next();

        if (context.Response.StatusCode == 200 && 
            context.Response.ContentType.Equals("application/html", StringComparison.OrdinalIgnoreCase))
        {
            buffer.Seek(0, SeekOrigin.Begin);
            var reader = new StreamReader(buffer);
            string responseBody = await reader.ReadToEndAsync();                    
            MemoryStream msNew = new MemoryStream();
            using (StreamWriter wr = new StreamWriter(msNew))
            {
                 wr.WriteLine("This is my new content");
                 wr.Flush();
                 msNew.Seek(0, SeekOrigin.Begin);
                 await msNew.CopyToAsync(stream);
            }
        }
    });


    // Add MVC to the request pipeline.
    app.UseMvc(routes =>
    {
         routes.MapRoute(
         name: "default",
         template: "{controller}/{action}/{id?}",
         defaults: new { controller = "Home", action = "Index" });                    
    });

【讨论】:

  • 这与我需要做的非常接近 - 我可以将文本附加到页面底部,但我需要能够将响应正文作为字符串读出并对其进行修改。我试过用这个:
  • var encoding = context.Response.Headers["Content-Encoding"];使用 (StreamReader reader = new StreamReader(context.Response.Body)) { string text = reader.ReadToEnd(); }
  • 但我得到了这个异常:ArgumentException: Stream was not readable
  • 检查更新我已经解决了流不可读的问题。
  • @Yishai Galatzer:实际上我已经为特定路径制作了示例,并且您添加了 contenttype html,所以您认为它适用于所有请求吗?
猜你喜欢
  • 2015-07-15
  • 2016-06-30
  • 1970-01-01
  • 1970-01-01
  • 2015-04-16
  • 2012-10-29
  • 1970-01-01
  • 1970-01-01
  • 2012-03-28
相关资源
最近更新 更多