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.