我正在尝试为任何页面请求执行一次代码,因此我将此代码放在Global.asax中的Application_PreRequestHandlerExecute方法中。问题是,对于每个页面请求,此方法可能被调用10次或更多次。所以,问题是如何让我的代码每次请求只调用一次?我尝试将其添加到Application_PreRequestExecute方法:
const string key = "scanning_forms";
object chack = HttpContext.Current.Items[key];
if (chack == null)
{
// Code I want to execute only once
}
问题是,由于某种原因,检查总是错误的!有任何想法吗?我很自然地使用Sitecore。我不认为这应该是重要的。
谢谢,
萨钦
答案 0 :(得分:4)
老兄,看起来这是解决一个相当简单问题的过于复杂的解决方案。由于您已标记此#sitecore,我认为您在Sitecore解决方案的上下文中需要此解决方案。
解决方案中应该只有一个布局文件(每个设备)。它将针对每个页面请求执行。例如,将您的代码放在Page_Load()中。
即使您有多个布局,也可以创建一个公共基类(例如,布局),并让每个布局代码文件继承自此。然后按上述方式行事。
答案 1 :(得分:1)
您可以设置会话变量并检查它是否存在:
if (Session["RequestMade"] == null) {
//Do logic
Session["RequestMade"] = true;
}
然而;我不确定你是不是应该这样做。你能否提供一些关于你想要达到的目标的更多信息?
答案 2 :(得分:1)
我不完全确定Kit的解决方案是否有效(我会假设对资源/页面/等的请求是单独的)。
我相信您需要在当前方法中验证请求是否针对页面(即检查请求是否针对* .aspx文件,或检查请求是否由PageHandler)
编辑:
我认为在运行代码之前进行这样的检查应该有效(假设代码运行时填充了Handler属性):
if(HttpContext.Current.Handler is Page)
答案 3 :(得分:1)
在Sitecore的Web.Config中修改HttpRequest管道。一个简单的解决方案是添加自己的管道处理器。但是,这种方法可能存在性能方面的考虑因素。另一个考虑因素是在Sitecore项目的布局详细信息中使用子布局或web控件。
答案 4 :(得分:0)
每个请求都会触发该事件。这意味着它将触发您在页面上可能拥有的任何WebResource.axd资源。
至于确保它只被调用一次,你正在做像HttpContext.Current.Items.Add(key,something)这样的事情吗?
答案 5 :(得分:0)
您可能希望将代码移至Application_BeginRequest
,每次请求都会触发一次。它在生命周期的早期阶段。请参阅http://www.techrepublic.com/article/working-with-the-aspnet-globalasax-file/5771721。
如果您的意图真的是每页一次(而不是该页面上的单独内容,例如生成请求的图像),那么您可以检查请求标头以确定请求将其缩小到该页面。
答案 6 :(得分:0)
我在自己的开发中注意到的一件事是,当您使用内置调试器在Visual Studio中运行ASP.NET代码时,即使对于图像和css文件以及其他非服务器,也会调用global.asax文件方法 - 文件类型。但是,当您将代码部署到服务器时,IIS将不会执行此操作(在典型设置中)。您是否在生产环境中遇到此问题?或者只是在你的本地机器上?
如果您确定问题是为所有图像和其他资源调用该方法,并且它仍然是一个问题,那么您可以将代码包装在if块中以确保您使用的是ASP。 NET页面继续之前。像这样:
// This code only runs if the local file requested has ".aspx" in the name somewhere.
if(HttpContext.Current.Request.LocalPath.ToString().IndexOf(".aspx") > 0)
{
const string key = "scanning_forms";
object chack = HttpContext.Current.Items[key];
if (chack == null)
{
// Code I want to execute only once
}
}
我从记忆中输入了这个,所以可能是错的。如果您有C:\INETPUB\WWWROOT\MYSITE\Resources for .aspx files\images\banner.gif
这样的文件,也会导致误报。所以你可能想让检查更加健壮。我会留给你的。