【问题标题】:How to call some code once per page request如何在每个页面请求中调用一次代码
【发布时间】:2011-08-12 15:38:04
【问题描述】:

我试图为任何页面请求执行一次代码,因此我将此代码放在 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。不过,我认为这不应该很重要。

谢谢,

萨钦

【问题讨论】:

  • 页面上的所有图片是否也都调用了它?
  • 您实际上并没有显示要写入 HttpContext.Current.Items 的代码。是不是你的问题?
  • 不,这不是问题所在。 if 语句中的第一条语句是对 httpContext 的写入。
  • 我认为它也可能会在所有图像上被调用 - 是否有另一种 global.asax 方法可以用于页面请求?

标签: c# sitecore global-asax


【解决方案1】:

伙计,这似乎是解决一个相当简单的问题的过于复杂的解决方案。由于您已标记此#sitecore,我假设您在 Sitecore 解决方案的上下文中需要此解决方案。

您的解决方案中应该只有 1 个布局文件(每个设备)。它将为每个页面请求执行。将您的代码放在那里,例如在 Page_Load() 中。

即使您有多个布局,您也可以创建一个公共基类(例如布局),并让每个布局代码文件都继承自此。然后按照上面的操作。

【讨论】:

    【解决方案2】:

    您可以设置一个会话变量并检查它是否存在:

    if (Session["RequestMade"] == null) {
        //Do logic
        Session["RequestMade"] = true;
    }
    

    但是;我不确定你应该从一开始就这样做。您能否提供更多关于您想要实现的目标的信息?

    【讨论】:

      【解决方案3】:

      我不完全确定 Kit 的解决方案是否有效(我假设对资源/页面/等的请求是单独的)。

      我相信您需要在当前方法中验证请求是否针对页面(即检查请求是否针对 *.aspx 文件,或检查请求是否由PageHandler)

      编辑:

      我认为在运行您的代码之前进行这样的检查应该可以工作(假设在您的代码运行时已经填充了 Handler 属性):

      if(HttpContext.Current.Handler is Page)
      

      【讨论】:

        【解决方案4】:

        查看为 Sitecore 修改 Web.Config 中的 HttpRequest 管道。一个简单的解决方案是添加您自己的管道处理器。但是,这种方法可能存在性能方面的考虑。另一个考虑因素是在 Sitecore 项目的布局详细信息中使用子布局或 web 控件。

        【讨论】:

          【解决方案5】:

          每个请求都会触发该事件。这意味着它将触发您页面上可能拥有的任何 WebResource.axd 资源。

          至于确保它只被调用一次,你正在做类似 HttpContext.Current.Items.Add(key, something) 对吗?

          【讨论】:

            【解决方案6】:

            您可能希望将代码移动到Application_BeginRequest,每个请求都会触发一次。它处于生命周期的早期。见http://www.techrepublic.com/article/working-with-the-aspnet-globalasax-file/5771721

            如果您的意图确实是每页一次(而不是该页面上的单独事物,例如生成请求的图像),那么您可以检查请求标头以确定请求的内容以将其缩小到该页面。

            【讨论】:

              【解决方案7】:

              我在自己的开发中注意到的一件事是,当您使用内置调试器在 Visual Studio 中运行 ASP.NET 代码时,即使对于图像和 css 文件以及其他非服务器,也会调用 global.asax 文件方法-side 文件类型。但是,当您将代码部署到服务器时,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 这样的文件,也会导致误报。所以你可能想让检查更健壮。我会把它留给你。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2015-06-24
                • 1970-01-01
                • 1970-01-01
                • 2016-07-23
                • 1970-01-01
                • 2022-09-21
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多