ASP.NET MVC4 - OutputCache异常

时间:2013-04-27 18:21:41

标签: asp.net asp.net-mvc-4 outputcache

我能够适当地利用ASP.NET MVC4 OutputCache ,并将以下代码作为Controller的索引()的一个属性:

[OutputCache(Duration = 600, VaryByParam = "none")]

然而,

要管理不同的缓存方案,根据 the MSDN documentation ,我们可以使用 OutputCache缓存(例如)我们的控制器Index()方法 即可。在文档之后,我们最终得到以下代码:

我们的控制器中的

    //[OutputCache(Duration = 600, VaryByParam = "none")] //works without any modification to the Web.config
    [OutputCache(CacheProfile = "Cache1Hour", VaryByParam = "none")]
    public ActionResult Index()
    {
        return View();
    }

在我们的Web.config

  <system.web>
    <caching>
      <outputCacheSettings>
          <outputCacheProfiles>
              <add name="Cache1Hour" duration="3600"/>
          </outputCacheProfiles>
      </outputCacheSettings>
    </caching>
            ...
            ...
            ...
  </system.web>

问题/问题: 显然我错过了一些东西,因为我不断抛出以下异常:

异常详细信息:System.Web.HttpException:未定义“Cache1Hour”缓存配置文件。请在配置文件中定义它。

完全例外:

Server Error in '/' Application.
The 'Cache1Hour' cache profile is not defined.  Please define it in the configuration file.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.Web.HttpException: The 'Cache1Hour' cache profile is not defined.  Please define it in the configuration file.

Source Error:

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

Stack Trace:


[HttpException (0x80004005): The 'Cache1Hour' cache profile is not defined.  Please define it in the configuration file.]
   System.Web.UI.Page.InitOutputCache(OutputCacheParameters cacheSettings) +3136900
   System.Web.Mvc.OutputCachedPage.FrameworkInitialize() +47
   System.Web.UI.Page.ProcessRequest(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +48
   System.Web.UI.Page.ProcessRequest() +72
   System.Web.UI.Page.ProcessRequestWithNoAssert(HttpContext context) +21
   System.Web.UI.Page.ProcessRequest(HttpContext context) +58
   System.Web.Mvc.OutputCacheAttribute.OnResultExecuting(ResultExecutingContext filterContext) +184
   System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func`1 continuation) +72
   System.Web.Mvc.<>c__DisplayClass1c.<InvokeActionResultWithFilters>b__19() +72
   System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func`1 continuation) +388
   System.Web.Mvc.<>c__DisplayClass1c.<InvokeActionResultWithFilters>b__19() +72
   System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters(ControllerContext controllerContext, IList`1 filters, ActionResult actionResult) +303
   System.Web.Mvc.Async.<>c__DisplayClass2a.<BeginInvokeAction>b__20() +155
   System.Web.Mvc.Async.<>c__DisplayClass25.<BeginInvokeAction>b__22(IAsyncResult asyncResult) +184
   System.Web.Mvc.Async.WrappedAsyncResult`1.End() +136
   System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +56
   System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeAction(IAsyncResult asyncResult) +40
   System.Web.Mvc.<>c__DisplayClass1d.<BeginExecuteCore>b__18(IAsyncResult asyncResult) +40
   System.Web.Mvc.Async.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar) +47
   System.Web.Mvc.Async.WrappedAsyncResult`1.End() +151
   System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +59
   System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +40
   System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult) +44
   System.Web.Mvc.Async.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar) +47
   System.Web.Mvc.Async.WrappedAsyncResult`1.End() +151
   System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +59
   System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +40
   System.Web.Mvc.Controller.EndExecute(IAsyncResult asyncResult) +39
   System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.EndExecute(IAsyncResult asyncResult) +39
   System.Web.Mvc.<>c__DisplayClass8.<BeginProcessRequest>b__3(IAsyncResult asyncResult) +45
   System.Web.Mvc.Async.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar) +47
   System.Web.Mvc.Async.WrappedAsyncResult`1.End() +151
   System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +59
   System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +40
   System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +40
   System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) +38
   System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +9629296
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +155

1 个答案:

答案 0 :(得分:6)

我发现我将配置代码放在'View's'Web.config而不是根Web.config中。我放置后:

<system.web>
    <caching>
      <outputCacheSettings>
          <outputCacheProfiles>
              <add name="Cache1Hour" duration="3600"/>
          </outputCacheProfiles>
      </outputCacheSettings>
    </caching>
    ...
    ...
    ...
</system.web>   

...进入正确的Web.config方法被正确缓存,我希望这有助于其他人。如果没有别的,我在这篇文章中显示的代码和策略为您提供了使用OutputCache在控制器中缓存方法的最低要求。