在ASP.Net HttpModule中使用静态变量

时间:2012-10-18 19:41:24

标签: c# asp.net iis httpmodule

我正在使用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时,它会给我:

来自10/18/2012 3:37:33 PM的用户

来自10/18/2012 3:37:35 PM的用户

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

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

那么,为什么即使我可以刷新十次,也只有两个结果可以通过呢?

提琴手结果: enter image description here

3 个答案:

答案 0 :(得分:1)

您的浏览器缓存了html,images和css等资源。

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

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

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

答案 1 :(得分:1)

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

为了解决这个问题,我选择了输出缓存 - &gt;编辑功能设置... - &gt;我取消选中Enable Cache和Enable Kernel cache。

答案 2 :(得分:0)

试试这个。

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