当前位置: 首页 > 编程语言 > C#

如何将HttpModule限制为每个请求只能调用一次?Share

时间:2023-04-10 19:53:28 C#

如何限制HttpModule每次请求只能调用一次?这是我对HttpModule的实现:Filewithmodule:publicclassHttpModuleRewriter:IHttpModule{#regionIHttpModulepublicvoidInit(HttpApplicationapp){app.BeginRequest+=ProcessRequest;}publicvoidDispose(){}#endregion#regionProtectedMethodsprotectedvoidProcessRequest(objectsender,EventArgse){...}}在web.config中:我在HttpModuleRewriter类的“Init”方法中放置了一个断点。应用程序启动时第一次调用该方法...每个页面请求仅调用一次该模块。如果我快速向页面发出请求(第二个请求将在处理第一个请求之前发送),那么会少量调用“Init”方法,每个后续的页面请求都会导致2-3次调用我的模块…为什么?我怎样才能避免这种情况?谢谢。PS我已经将公共构造函数添加到HttpModuleRewriter以计算引荐来源网址,并且在我的请求期间我创建了5个模块......并且实际上为每个页面调用了2个模块请求......但仅适用于第一个导航页面,所有后续页面(我'我已经检查了其他3个页面)该模块只被调用一次(只调用了一个实例)...为什么第一页被处理了两次?建议的答案(使用“初始化”标志)也无济于事。如果Init()在第二个请求到来之前没有完成,那么你的HttpModule还没有准备好。如果你的Init()方法中的代码只能运行一次,那么你可以设置一个标志(boolinitialized)并使用锁来防止代码被多个线程运行,eg:privatestaticboolinitialized;私有静态对象lockObject=newobject();publicvoidInit(HttpApplicationapp){lock(lockObject){if(!initialised){app.BeginRequest+=ProcessRequest;//...这里的其他代码已初始化=true;}}}更新:正如这篇文章中所解释的那样,ASP.NET可能会创建HttpModule的多个实例,因此Init()可能会被调用多次。这是设计使然。因此,您必须设计您的模块,以便应该只运行一次的代码只运行一次-通过应用锁,如上所述。我会说显而易见的答案是您的处理程序正在处理多个请求,可能是针对样式表或图像的。将以下内容添加到您的ProcessRequest事件处理程序,并向context.Request.PhysicalPath添加一个监视以确认此操作。HttpApplication应用程序=(HttpApplication)发送者;HttpContext上下文=application.Context;字符串文件名=Path.GetFileName(context.Request.PhysicalPath);如果您不希望处理程序为图像请求等运行,那么您需要做的就是检查“.aspx”或类似的东西。当您执行两次Init()时,BeginRequest事件将调用处理两次,因为它有两个事件处理程序。+=运算符将新的事件处理程序添加到列表中,它不会替换旧的。?yvind有一个正确的解决方案。以上是C#学习教程:如何限制HttpModule每次请求只能调用一次?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: