将ASP.NET MVC 3.0与Visual Studio 2010(SP1之前版和SP1版)以及ASP.NET开发服务器一起使用时出现错误“ _AppStart执行时无法创建存储范围。”每次我调试。当我等待几秒钟并刷新浏览器时,它按预期工作。
相关work-item #7828 on codeplex没有官方回复。
完整堆栈跟踪:
Server Error in '/' Application.
--------------------------------------------------------------------------------
Storage scopes cannot be created when _AppStart is executing.
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.InvalidOperationException: Storage scopes cannot be created when _AppStart is executing.
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:
[InvalidOperationException: Storage scopes cannot be created when _AppStart is executing.]
System.Web.WebPages.Scope.AspNetRequestScopeStorageProvider.set_CurrentScope(IDictionary`2 value) +83361
System.Web.WebPages.Scope.ScopeStorage.CreateTransientScope(IDictionary`2 context) +95
System.Web.WebPages.Scope.ScopeStorage.CreateTransientScope() +76
System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext) +84
System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(RequestContext requestContext) +10
System.Web.Mvc.<>c__DisplayClassb.<BeginProcessRequest>b__5() +37
System.Web.Mvc.Async.<>c__DisplayClass1.<MakeVoidDelegate>b__0() +21
System.Web.Mvc.Async.<>c__DisplayClass8`1.<BeginSynchronous>b__7(IAsyncResult _) +12
System.Web.Mvc.Async.WrappedAsyncResult`1.End() +62
System.Web.Mvc.<>c__DisplayClasse.<EndProcessRequest>b__d() +50
System.Web.Mvc.SecurityUtil.<GetCallInAppTrustThunk>b__0(Action f) +7
System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(Action action) +22
System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +60
System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) +9
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +8862381
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +184
答案 0 :(得分:7)
虽然我不确定为什么会发生这种情况(我也无法重现),但我可能会尝试一些修复方法。 WebPageHttpModule(在System.Web.WebPages中)假定设置为AppStartExecuteCompleted,但它没有,这就是为什么你得到一个异常(所有这些猜测都是基于那个)。
所以...环顾源代码我相信这个bug的来源是Web Development Server和PreApplicationCode +模块的动态注册(WebPageHttpModule)。模块init应始终在应用程序启动时运行,但由于某种原因,我 GUESS 它不会。也许某人可以以某种方式测试它。
我想到的一些修复(再次,这是纯粹的猜测工作,因为我无法重现这一点)。
1)尝试在WebConfig中静态注册WebPageHttpModule模块。 update 我测试了这个,这不会引发异常。但是,它注册了两个httpmodules。
2)根据你所链接的那个帖子的评论,似乎这不会发生在IIS上,所以我会尝试在IIS Express下运行(在VS 2010 SP1下)。
正如我之前所说,这只是猜测工作。模块无法运行可能还有其他原因...例如Web服务器无法正常重启,包括PreApplicationCode的某些问题,或者在HttpModule中没有将s_appStartExecutedLock重置为false,或者HttpContext.Items可能还有什么问题导致模块无法运行...
答案 1 :(得分:3)
这似乎仍然是一个问题,当然在VS 2010 SP1上使用MVC 3模板。对于仍有问题的人,我发现以下博客文章中的解决方案可以快速可靠地运行:
http://www.codinghub.net/2012/12/storage-scopes-cannot-be-created-when.html
答案 2 :(得分:2)
我刚刚在我的项目中发生过这种情况......而且也无法重现。但我有一个理论:
在思考过程中,我在一个帮助器类中声明了一个静态字典对象,并且在重新编译后不久,我得到了这个错误。这是我的声明:
private static Dictionary<string, string> FormatList = new Dictionary<string, string>();
由于静态变量在整个Web应用程序中共享(而不仅仅是请求的上下文),我认为在App_Start执行时,字典的构造函数被触发了。这对我来说很有意义......因为App_Start可能正在设置所有会话和应用程序存储。如果在存储设置之前构建静态变量......繁荣就是炸药。
只是想把那个理论抛到那里......也许这就是原因......也许不是。但这是值得研究的事情(因为这样的静态声明对象很危险。)
答案 3 :(得分:-1)
断开数据库连接。连接处于活动状态时无法重新创建。
感谢。
答案 4 :(得分:-2)
简单的重建解决方案帮助了我:请尝试清理并重建(不确定“Microsoft”发布了任何重虫的MVC3)