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

C# 在ASP.Net HttpModule中使用静态变量,c#,asp.net,iis,httpmodule,C#,Asp.net,Iis,Httpmodule,我正在使用一个HttpModule来拦截每个对我网站的请求,以便为它们分配身份验证cookie,这只是一个初步版本,但我在HttpModule中有一个静态列表,对于每个新请求,我都在列表中添加一个元素。出于测试目的,我将它们全部写入响应,以查看我的方法是否有效,但无论列表中有多少用户,它只会给我两个值 这是我的一个代码示例,我用字符串列表替换了用户列表,从而保持了代码的简单性 public class SCCModule : IHttpModule { private static Li

我正在使用一个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);
        }
    }
}
公共类SCCModule:IHttpModule
{
私有静态列表_users=新列表();
公共void Init(HttpApplication上下文)
{
context.PreRequestHandlerExecute+=OnPreRequestHandlerExecute;
}
公共空间处置()
{
}
public void OnPreRequestHandlerExecute(对象源,事件参数e)
{
HttpApplication应用程序=(HttpApplication)源;
HttpResponse response=app.Context.response;
HttpRequest请求=app.Context.request;
_添加(“来自”+DateTime.Now+“
”)的用户; foreach(用户中的变量u) { 答复.书面答复(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页面上点击refresh的前两次将触发我的断点,之后不会触发。我输入的任何新URI将只命中断点两次

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

小提琴手结果:

您的浏览器缓存了html、图像和css等资源

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

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

HttpRequest request = app.Context.Request;
_users.Add("A user from " + DateTime.Now + " - " + 
    app.Context.Request.Path + "</br>");
HttpRequest请求=app.Context.request;
_users.Add(“来自”+DateTime.Now+“-”的用户”
app.Context.Request.Path+“
”;
问题出在IIS本身。已启用输出缓存,因此即使客户端请求新页面,服务器也不会发送任何新页面

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

试试这个

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


抱歉,我会在文本中让它更明显。请尝试附加Fiddler,您的浏览器可能不会返回到服务器,而只是显示缓存页面。我猜前两个请求是index.html和favicon.ico。我稍微修改了一下,然后发布了一个截图。不幸的是,不是缓存的请求。如果我等一会儿,比如说几分钟,然后刷新,我可以得到两个新结果。但如果不再次等待,再次按F5将不会显示新结果。实际上问题一直存在于IIS中。输出缓存阻止在间隔之间发送新页面。在缓存启动之前,我仍然不确定为什么允许我请求两个新页面。我检查了fiddler,它看起来没有缓存任何内容。到目前为止,只有一个近乎空白的页面可供调试。尚未缓存任何图像或CSS。每次刷新时,ASPX页面都会向服务器发送请求,但HTML页面不会。如果要重新加载HTML页面,请单击Ctrl+F5。