【问题标题】:ASP.NET custom HTTPModule - how to tell when writing last block of HTML in Write method?ASP.NET 自定义 HTTPModule - 如何判断在 Write 方法中写入最后一个 HTML 块的时间?
【发布时间】:2010-07-02 12:21:28
【问题描述】:

我编写了一个 Http 模块,它与当前请求的 Response.Filter 属性挂钩,并在 HTML 中进行各种替换,然后再将其发送到客户端。

所有工作都在重写基类 Stream 中的 Write 的 Write 方法中完成。

Write 方法被多次调用以获得单个响应 - HTML 似乎以块的形式写入输出流。我的问题是我没有一种有效且可靠的方法来判断当前块是否是最后一个块(为什么我想知道这一点,见下文)。我想出的唯一方法是检查块是否包含结束 html 标记 - 但这不是非常有效或可靠。

需要这样做的原因是模块必须将“刷新”HTTP 标头添加到响应中,但前提是 HTML 满足某些条件(并且某些条件意味着不得添加标头)。因此,只有在看到最后一个块时,代码才知道是否可以添加标头。因此,我需要对最后一个块进行测试,或者在每次调用 Write 时,如果当前 HTML 块通过测试(如果尚未添加),则添加标头,如果当前 HTML 块则删除标头未通过测试(如果已添加)。

那么,有没有更好的方法来测试最后一个卡盘,或者有没有办法测试响应中的特定标头并将其删除(似乎没有办法做到这一点 - 只是为了附加标题)?

谢谢

【问题讨论】:

    标签: asp.net stream httpmodule http-headers


    【解决方案1】:

    如果您可以计算出要从您的 html 源写入的字节总数,那么只需在调用 Write() 时计算字节数,以确定您何时写入最后一个块。

    此外,您无法在将内容发送到浏览器后添加标题。我认为,如果您避免调用 Flush() 来实际发送输出,则可以在编写内容后添加标头。

    【讨论】:

    • 不幸的是,我看不到计算内容总字节数的方法。我在 Write 方法中只能看到当前块的字节。仅供参考,我添加标题没有问题。
    • 源流是否提供长度属性?
    • 是的,但是流是只写的,并且在您尝试调用任何读取方法时立即引发异常。应该提到这个!我不太确定为什么它是只写的(我从一些 o/s 代码中复制了这个模块的想法)。
    • 输出流可能是只写的,但是输入(源)呢? html来自哪里?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-25
    • 1970-01-01
    • 2015-10-15
    • 1970-01-01
    • 2019-11-18
    • 1970-01-01
    相关资源
    最近更新 更多