0

每个搜索数据库都有大约 50 个应用程序变量。来自 Single Search.aspx 页面的总共 50 个搜索 Db,querid具体取决于它连接到特定数据库的 URL 中传递的 QueryString。

例如:if Search.aspx?li=1然后连接到1SearchDB

if Searcg.aspx?li=2 then Connect to 2SearchDB......

50SearchDB 我SearchDB根据QueryStringURL 维护每个访问者的总数,并增加文件中的应用程序变量GLOBAL.ASAX

在 Global.asax 中:

void Application_Start(object sender, EventArgs e)  
    { 
        // Code that runs on application startup 
        Application["1"] = 0;           
        Application["2"] = 0; 
        . 
        . 
        Application["50"] = 0; 

    } 

在 Search.aspx.cs 的页面加载中:

int LocalBody = Convert.ToInt32(Request.QueryString["li"]); 
public void Page_Load(object sender, EventArgs e) 
    { 
    Label1.Text = GetHits(LocalBody).ToString(); 
    } 


     private int GetHits(int LocalBody) 
        { 
            int counter=0; 
            switch (LocalBody) 
            { 
                case 1: 
                    Application["1"] = (int)Application["1"] + 1; 
                    counter=(int)Application["1"]; 
                    break; 
                case 2: 
                     Application["2"] = (int)Application["2"] + 1; 
                    counter=(int)Application["2"]; 
                    break; 
                . 
                . 
                case 50: 
                    Application["50"] = (int)Application["50"] + 1; 
                    counter=(int)Application["50"]; 
                    break;            default: 
                    break; 
            } 
            return counter; 

        } 

现在,我想将这些应用程序变量添加到 QUEUE 并在达到 1000 或在某些指定TIME INTERVAL说 20 分钟后,它必须将值写入 DB 或 Windows 事件日志。

是否编写任何服务或其他...!

4

1 回答 1

0

只要 WebApp 在内存中,Application 对象就会一直保留在内存中。如果一段时间内没有请求,IIS 可以关闭 WebApp。在这种情况下,存储在 Application 对象中的值将会丢失。假设即使 IIS 没有关闭 Web 应用程序,该对象仍驻留在站点的内存中。除非您将其持久保存到某个共享位置(例如数据库或消息队列),否则任何外部服务都无法访问此对象。

我的建议是不要使用应用程序对象。而是将其保存到内存存储中。我假设您不想每次更新值时都保存到数据库的原因是为了避免写入磁盘。因此,我建议使用 MSMQ 或 DotNetMQ 之类的消息队列或 Redis 之类的键值存储。

将数据保存在共享位置后,您可以让服务轮询该位置并每 1000 个项目或每 20 分钟保存一次。

于 2012-07-05T06:14:47.703 回答