RavenDb 的 KeyNotFoundException
KeyNotFoundException with RavenDb
刚刚在 IIS 中将 RavenDb Build-3528 安装为网站。
RavenDb 运行 很好,可以在 http://localhost:8080 上访问管理工作室,创建数据库等,到目前为止没问题。
然而,当我启动我的 MVC 5 应用程序(使用常规 MVC 控制器和 WebApi 控制器)时,应用程序在启动时崩溃并显示 json 消息:
{
message: "An error has occurred.",
exceptionMessage: "The given key was not present in the dictionary.",
exceptionType: "System.Collections.Generic.KeyNotFoundException",
stackTrace: " at System.Collections.Concurrent.ConcurrentDictionary`2.get_Item(TKey key) at Raven.Database.Server.Controllers.RavenBaseApiController.InnerInitialization(HttpControllerContext controllerContext) in c:\Builds\RavenDB-Stable-3.0\Raven.Database\Server\Controllers\RavenBaseApiController.cs:line 101 at Raven.Database.Server.Controllers.RavenDbApiController.InnerInitialization(HttpControllerContext controllerContext) in c:\Builds\RavenDB-Stable-3.0\Raven.Database\Server\Controllers\RavenDbApiController.cs:line 112 at Raven.Database.Server.Controllers.RavenDbApiController.<ExecuteAsync>d__3a.MoveNext() in c:\Builds\RavenDB-Stable-3.0\Raven.Database\Server\Controllers\RavenDbApiController.cs:line 54 --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__1.MoveNext()"
}
有趣的是:在 IIS 中安装 RavenDb 作为网站之前,我们使用 RavenDb 2.5 作为我们的 MVC 应用程序中的嵌入式服务器并且工作得很好。
在 Windows 事件管理器中我找不到任何有用的信息。
有人知道发生了什么事吗?
哈!
事实证明,如果您在 WebApiConfig.cs
中注释掉以下行,错误就会消失:
// Web API routes
config.MapHttpAttributeRoutes(); // <--- Offending line
显然 RavenDB 也会调用 MapHttpAttributeRoutes()
,所以存在冲突...
当然,注释掉该行意味着 WebApi 路由不再有效,抛出 Multiple actions were found that match the request
错误。
更新
在我的解决方案中,有一个需要 Raven.Database.dll
单元测试的项目,因为它在内存中使用 EmbeddableDocumentStore
到 运行 测试。
此 Raven.Database.dll
最终位于 MVC/WebApi 项目的 bin
文件夹中。一旦删除它,该网站就可以正常工作。所以这确实是 EmbeddableDocumentStore
WebApi 的破坏性破坏。
简而言之,请确保您的 WebApi 项目中没有对 Raven.Database.dll
的引用,并且 dll 也不会最终出现在您的 WebApi 项目的 bin
中(通过设置 Copy to Local = false
,例如)。
更新 2
原来我的主项目以某种方式引用了测试项目,这就是为什么 Raven.Database.dll
最终出现在我的主项目的 bin 文件夹中。只需删除不必要的引用即可解决问题,无需设置 Copy to Local = false
.
刚刚在 IIS 中将 RavenDb Build-3528 安装为网站。
RavenDb 运行 很好,可以在 http://localhost:8080 上访问管理工作室,创建数据库等,到目前为止没问题。
然而,当我启动我的 MVC 5 应用程序(使用常规 MVC 控制器和 WebApi 控制器)时,应用程序在启动时崩溃并显示 json 消息:
{
message: "An error has occurred.",
exceptionMessage: "The given key was not present in the dictionary.",
exceptionType: "System.Collections.Generic.KeyNotFoundException",
stackTrace: " at System.Collections.Concurrent.ConcurrentDictionary`2.get_Item(TKey key) at Raven.Database.Server.Controllers.RavenBaseApiController.InnerInitialization(HttpControllerContext controllerContext) in c:\Builds\RavenDB-Stable-3.0\Raven.Database\Server\Controllers\RavenBaseApiController.cs:line 101 at Raven.Database.Server.Controllers.RavenDbApiController.InnerInitialization(HttpControllerContext controllerContext) in c:\Builds\RavenDB-Stable-3.0\Raven.Database\Server\Controllers\RavenDbApiController.cs:line 112 at Raven.Database.Server.Controllers.RavenDbApiController.<ExecuteAsync>d__3a.MoveNext() in c:\Builds\RavenDB-Stable-3.0\Raven.Database\Server\Controllers\RavenDbApiController.cs:line 54 --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__1.MoveNext()"
}
有趣的是:在 IIS 中安装 RavenDb 作为网站之前,我们使用 RavenDb 2.5 作为我们的 MVC 应用程序中的嵌入式服务器并且工作得很好。
在 Windows 事件管理器中我找不到任何有用的信息。
有人知道发生了什么事吗?
哈!
事实证明,如果您在 WebApiConfig.cs
中注释掉以下行,错误就会消失:
// Web API routes
config.MapHttpAttributeRoutes(); // <--- Offending line
显然 RavenDB 也会调用 MapHttpAttributeRoutes()
,所以存在冲突...
当然,注释掉该行意味着 WebApi 路由不再有效,抛出 Multiple actions were found that match the request
错误。
更新
在我的解决方案中,有一个需要 Raven.Database.dll
单元测试的项目,因为它在内存中使用 EmbeddableDocumentStore
到 运行 测试。
此 Raven.Database.dll
最终位于 MVC/WebApi 项目的 bin
文件夹中。一旦删除它,该网站就可以正常工作。所以这确实是 EmbeddableDocumentStore
WebApi 的破坏性破坏。
简而言之,请确保您的 WebApi 项目中没有对 Raven.Database.dll
的引用,并且 dll 也不会最终出现在您的 WebApi 项目的 bin
中(通过设置 Copy to Local = false
,例如)。
更新 2
原来我的主项目以某种方式引用了测试项目,这就是为什么 Raven.Database.dll
最终出现在我的主项目的 bin 文件夹中。只需删除不必要的引用即可解决问题,无需设置 Copy to Local = false
.