使用RavenDb的KeyNotFoundException

时间:2015-01-20 22:06:52

标签: asp.net-mvc-5 ravendb asp.net-web-api2

刚刚在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作为网站之前,我们在我们的MVC应用程序中使用RavenDb 2.5作为嵌入式服务器并且运行得很好。

在Windows事件管理器中,我找不到任何有用的信息。

任何人都知道发生了什么?

1 个答案:

答案 0 :(得分:3)

哈!

事实证明,如果您在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中(通过设置{{1}例如)。

更新2

事实证明,我的主要项目以某种方式引用了测试项目,这就是为什么Copy to Local = false最终出现在我的主项目的bin文件夹中。只需删除那些不必要的引用即可,不需要设置Raven.Database.dll