在Application_Start期间读取应用程序配置

时间:2009-04-28 14:25:29

标签: asp.net optimization global-asax

考虑一个动态调整大型tiff文件大小的Web应用程序。当用户调用操作时,每个大的tiff文件被调整为jpg缩略图和更大的jpg。这些转换文件的尺寸始终相同。

在昨天的代码审查期间,其他一位开发人员问我为什么要在我的global.asax中设置这些维度,如下所示:

    Application["resizedImageWidth"] = int.Parse(ConfigurationManager.AppSettings["ResizedImageWidth"]);

,而不是在实际方法调用期间通过配置文件查找值。我将宽度存储在配置文件中,以防最终用户在测试应用程序后想要更改尺寸,因此我不必更改内联代码。

我给出的推理是每次生成图像时都阻止从配置文件中读取,但如果在查找应用程序级变量期间出现类似的开销则无法回答。这种优化可能不会对大规模的性能产生影响,但我想知道社区认为更有效的解决方案是什么,即在应用程序启动期间设置它们,或者在方法调用期间动态读取它们。

3 个答案:

答案 0 :(得分:2)

通常,您应该根据需要随时阅读配置。该框架将缓存配置文件,因此它具有相当高的性能。而且我相信(不要引用我)ASP.Net可以监控并将更改引入配置文件而无需重新启动应用程序。

我通常喜欢创建一个Configuration类,它将隐藏存储值的详细信息:

public static class Config
{

   public static int GetXDimension()
   {
      ...
   }

}

这样可以使配置代码中的调用代码保持干净,如果您发现我错了,则无需在任何地方更改代码。

答案 1 :(得分:1)

将此值存储在Application对象中是正确的。实际上,这是提供 Application 背后的明确目的:保存可在应用程序的所有页面和用户中使用的值。

由于应用程序设置保存在内存中,因此确实会更高效。很明显,从内存中读取比从配置文件中读取要快得多(更不用说通过ConfigurationManager.AppSettings类方法和整数解析进行查找)。

对web.config文件的任何更改都会导致重新启动应用程序。实际上,这是我在测试期间重新启动应用程序(如果需要)的方式。如果您需要“动态”更改此值,您甚至可能希望将此值存储在数据库的“配置”表中,而不是将其保存在Web.config文件中,以便更改它不会重新启动应用程序。

我使用的一个技巧类似于Josh的Config类:我有一个“BusinessLogic”类,我在这个类的静态变量中放置了一些设置,以便我可以以类型安全的方式访问它们。这并不难,而且在可读性方面,回报非常明显。

答案 2 :(得分:1)

我建议扩展Josh的答案并按需调用它,然后将其缓存到私有变量中:

public static class Config
{
   private static int? xDimension;
   public static int GetXDimension()
   {
      if(xDimension == null)
          xDimension = int.Parse(ConfigurationManager.AppSettings["ResizedImageWidth"]);
      return xDimension.Value;
   }
}

或进入应用程序:

public static class Config
{
   public static int GetXDimension()
   {
      if(Application["xDimension"] == null)
          Application["xDimension"] = int.Parse(ConfigurationManager.AppSettings["ResizedImageWidth"]);
      return (int)Application["xDimension"];
   }
}