【问题标题】:Can static html pages be post-processed in IIS?静态 html 页面可以在 IIS 中进行后处理吗?
【发布时间】:2015-09-09 15:33:42
【问题描述】:

有一个 WebForms 项目,有一堆 aspx 和 html 页面。我想以类似于here 的方式对要在HttpModule 中呈现的html 标记进行后处理。对于有效的 aspx 页面。

但是,对于 html 页面,当我尝试从 Request.InputStream 读取时,它是空的,Request.InputStream.Length 等于 0。我做错了什么,是否可以使用 ASP 动态更改 html 页面的标记。 NET 引擎?

背景信息:我想根据用户权限有条件地删除一些 html 元素。

更新: 根据 cmets,我更新了 web.config 但无法获得所需的结果。当我点击 /my.html 页面时,请求到达我的模块,我能够读取 cookie、标头,但这不是我想要的。我想阅读html页面的内容并将更新的版本写入context.Response。 为了以防万一(集成和经典模式),我尝试在 IIS 和 Cassini 中运行 webapp。

public void Init(HttpApplication context)
    {
        context.PostRequestHandlerExecute += ContextOnPostRequestHandlerExecute;
    }

    private void ContextOnPostRequestHandlerExecute(object sender, EventArgs eventArgs)
    {
        var app = sender as HttpApplication;
        if (app == null)
        {
            return;
        }

        var url = app.Request.Url;
        if (url.AbsolutePath.EndsWith(".html"))
        {
            var length = app.Request.ContentLength; // always equal 0
        }
    }

Web.config:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.web>
  <authentication mode="None" />
  <compilation debug="true" targetFramework="4.5">
  <buildProviders>
    <add extension=".html" type="System.Web.Compilation.PageBuildProvider" />
  </buildProviders>
</compilation>
<httpModules>
  <add name="MyModule" type="TestWebApp.MyModule, TestWebApp" />
</httpModules>
<httpRuntime targetFramework="4.5" />
<pages>
  <namespaces>
    <add namespace="System.Web.Optimization" />
    <add namespace="Microsoft.AspNet.Identity" />
  </namespaces>
  <controls>
    <add assembly="Microsoft.AspNet.Web.Optimization.WebForms" namespace="Microsoft.AspNet.Web.Optimization.WebForms" tagPrefix="webopt" />
  </controls>
</pages>
<sessionState mode="InProc" customProvider="DefaultSessionProvider">
  <providers>
    <add name="DefaultSessionProvider" type="System.Web.Providers.DefaultSessionStateProvider, System.Web.Providers, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="DefaultConnection" />
  </providers>
</sessionState>
</system.web>

<system.webServer>
<validation validateIntegratedModeConfiguration="false"/>
<modules runAllManagedModulesForAllRequests="true">
  <remove name="FormsAuthentication" />
  <add name="PostprocessHtmlModule" type="TestWebApp.MyModule, TestWebApp" preCondition="integratedMode" />
</modules>
<handlers>
  <add name="html" verb="GET, HEAD, POST, DEBUG" path="*.html" type="System.Web.UI.PageHandlerFactory" />
</handlers>
</system.webServer>
</configuration>

【问题讨论】:

  • “静态”页面是不能修改的 ASPX 页面还是严格来说是 HTML 页面?
  • 它不是 ASP.NET,除非它是 .. 在 ASP.NET 中,如果它们是“静态”的,则不会在哪些 HTML 页面下处理。
  • @myroman 是的......这里的回答类似(相同的主题,不同的问题,所以不投票以重复关闭):stackoverflow.com/a/21970733/1810243。或带有自定义处理程序的类似响应stackoverflow.com/a/19124733/1810243

标签: c# asp.net iis ihttpmodule


【解决方案1】:

确保让 Web 服务器知道它应该使用 asp.net 管道来处理静态内容。默认情况下,您的应用不会处理静态页面。比如:

这是经过测试的配置,我知道它可以工作。

<system.web>
    <compilation>
        <buildProviders>
        <add extension=".html" type="System.Web.Compilation.PageBuildProvider" />
        </buildProviders>
    </compilation>
</system.web>

<system.webServer>
    <handlers>
        <add name="html" verb="GET, HEAD, POST, DEBUG" path="*.html" type="System.Web.UI.PageHandlerFactory" />
    </handlers>
</system.webServer>

【讨论】:

  • 我添加了这个,它对 都不起作用,Request.InputStream.Length = 0。还尝试添加 ,错误仍然存​​在。不知道在这个阶段该做什么。我应该设置 mimeType 吗?
  • 它应该已经存在了。我会在 google httphandler 上搜索静态 .html 文件。这可能是配置中的错字。这是一种方式forums.iis.net/t/1177995.aspx
猜你喜欢
  • 2016-09-03
  • 1970-01-01
  • 2017-02-13
  • 2017-08-06
  • 1970-01-01
  • 2010-10-07
  • 2023-04-02
  • 1970-01-01
  • 2017-12-05
相关资源
最近更新 更多