【问题标题】:Using a static variable in an ASP.Net HttpModule在 ASP.Net HttpModule 中使用静态变量
【发布时间】:2012-10-18 19:41:23
【问题描述】:

我正在使用 HttpModule 拦截对我的网站的每个请求,以便为它们分配身份验证 cookie,这只是一个初步版本,但我的 HttpModule 中有一个静态列表,并且对于我添加的每个新请求列表中的一个元素。出于测试目的,我将它们全部写入响应,以查看我的方法是否有效,但无论列表中有多少用户,它都只会给我两个值。

这是我的代码示例,我通过将用户列表替换为字符串列表来保持简单。

public class SCCModule : IHttpModule
{
    private static List<string> _users = new List<string>();

    public void Init(HttpApplication context)
    {
        context.PreRequestHandlerExecute += OnPreRequestHandlerExecute;
    }
    public void Dispose()
    {

    }
    public void OnPreRequestHandlerExecute(Object source, EventArgs e)
    {
        HttpApplication app = (HttpApplication)source;
        HttpResponse response = app.Context.Response;
        HttpRequest request = app.Context.Request;

        _users.Add("A user from " + DateTime.Now + "</br>");

        foreach(var u in _users)
        {
            response.Write(u);
        }
    }
}

从网站加载示例 index.html 时,它给了我:

2012 年 10 月 18 日下午 3:37:33 的用户

2012 年 10 月 18 日下午 3:37:35 的用户

关于我的设置的信息:我正在运行 IIS7.5,我已经向其中添加了一个模块,它是执行优先级顺序中的第一个。我在 web.config 中启用了调试。我的 VisualStudio 设置为构建调试配置,并且有一个构建后事件可以将我的 DLL 直接复制到我网站的 bin 文件夹中。我将自己附加到 w3wp.exe 进程以对其进行调试。

一个有趣的事实:调试时。我在 index.html 页面上点击刷新的前两次将触发我的断点,之后它不会。我输入的任何新 URI 只会命中两次断点。

那为什么我可以刷新十次,但似乎只有两个结果呢?

提琴手结果:

【问题讨论】:

  • 对不起,我会在文中更明显的。
  • 尝试附加 Fiddler,您的浏览器可能不会返回服务器,只是显示一个缓存页面。我的猜测是前两个请求是针对 index.html 和 favicon.ico。
  • 我稍微摆弄了一下并发布了截图。不幸的是,这不是缓存的请求。如果我稍等片刻,比如说几分钟,然后我刷新我可以得到两个新结果。但是除非我再次等待,否则再次按 F5 不会显示新结果。
  • 其实问题一直在IIS。输出缓存阻止在间隔之间发送新页面。仍然不确定为什么在缓存开始之前允许我请求两个新页面。

标签: c# asp.net iis httpmodule


【解决方案1】:

您的浏览器已经缓存了html、图片和css等资源。

一旦浏览器缓存了它们,除非您在 IE 中单击 Ctrl+F5,否则它们将不会再次被询问。

您可以使用 Request.Path 查看请求。

HttpRequest request = app.Context.Request;
_users.Add("A user from " + DateTime.Now + " - " + 
    app.Context.Request.Path + "</br>");

【讨论】:

  • 我检查了提琴手,看起来没有任何内容被缓存。到目前为止,只有一个几乎空白的页面用于调试。还没有要缓存的图像或 CSS。
  • ASPX 页面会在每次刷新时向服务器发送请求,但 HTML 页面不会。如果要重新加载 HTML 页面,请单击 Ctrl+F5。
【解决方案2】:

问题出在 IIS 本身。启用了输出缓存,因此即使客户端请求新页面,服务器也不会发送任何新页面。

为了解决这个问题,我去了输出缓存 -> 编辑功能设置... -> 我取消选中了启用缓存和启用内核缓存。

【讨论】:

    【解决方案3】:

    试试这个。

    <location path="data">
      <system.webServer>
        <staticContent>
            <clientCache cacheControlMode="NoControl" />
        </staticContent>
        <caching enabled="false" enableKernelCache="false" />
      </system.webServer>
    </location>
    

    【讨论】:

      猜你喜欢
      • 2010-11-02
      • 2010-10-25
      • 2012-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-05
      相关资源
      最近更新 更多