2012-12-21 68 views
2

我有一个在localhost:8080上设置的RavenDB服务实例,并且使用OAuth插件来存储简单的用户文档进行身份验证。我使用的是id和用户电子邮件的名称。以下代码正常运行以存储用户RavenDB服务Session.Query不返回结果

public AccountUserDocument CreateUser(RegisterModel model) 
{ 
    using (IDocumentSession session = DataDocumentStore.Instance.OpenSession()) 
    { 
     Guid userId = Guid.NewGuid(); 

     session.Store(new AccountUserDocument 
      { 
       Name = model.Email, 
       Id = String.Format("Raven/Users/{0}", userId), 
       AllowedDatabases = new[] { "*" }, 

       Email = model.Email, 
       FirstName = model.FirstName, 
       LastName = model.LastName, 
       FacebookId = 0, 
       Expires = DateTime.Now.AddMonths(1), 
       AccessToken = string.Empty 

      }.SetPassword(model.Password)); 

     session.SaveChanges(); 

     return session.Load<AccountUserDocument> 
         (String.Format("Raven/Users/{0}", userId)); 
    } 
} 

并返回一个有效的用户对象。然而,当我打电话

return session.Query<AccountUserDocument>() 
       .Customize(x => x.WaitForNonStaleResults()) 
       .Where(x => x.Name == email) 
       .SingleOrDefault(); 

我什么也没得到。它一周前一直在工作,但现在它没有。如果我打开RavenDB工作室,我可以看到用户和名称正是我如何进入它(我甚至复制并粘贴到文本字段)。

enter image description here

我曾尝试停止和重新启动服务希望能解决这个问题,但事实并非如此。

我想知道如果有人能指出我如何调试这里发生的事情。完整的代码库可以在这里

https://github.com/jamesamuir/MVC_Facebook_Auth

发现,如果有人倾向于下载。

在此先感谢。

+1

在您提供的链接中找不到任何相关的代码。错误的链接?或者你的回购没有更新?我没有看到任何错误,除非要小心,不要在生产中调用'WaitForNonStaleResults()'。另外,通过在同一个会话中调用'.Load()',你并不真正从服务器获取它。它会缓存在会话中。 –

+0

因此,在挖掘了一下后,我发现我可以将一个简单的文档保存到服务中并查询它。但是,当我使用Authentication Bundle时,它似乎在我按名称查询时返回null。我创建了一个简单的项目来演示这种行为。它可以在https://github.com/jamesamuir/RavenConnTest.git 找到我使用的服务器的992构建 和1.0.960的客户端和身份验证包,通过nuget安装 – jamesamuir

回答

1

嗯,我发现你提供的代码示例有很多错误 - 例如客户端和服务器版本不匹配。另外,Authentication Bundle是一个1.0版本的功能,它在2.0中已经被弃用,几乎是最终版本,所以您正在编写代码,您最终必须替换它。

但是要回答你的问题,你不能从你的查询中得到结果的具体原因是你选择使用以“Raven /”开头的文档密钥,这是RavenDB系统文档的约定,没有索引。

如果您从您的ID中删除“Raven /”,它将起作用。

此外,你不应该使用.WaitForNonStaleResults() - 这仅用于单元测试,并且在生产中是危险的。如果您真的觉得您需要等待,请使用.WaitForNonStaleResultsAsOfNow() - 这样更安全是因为它提供了一个临界值。

+0

感谢您的快速回复!我正在使用一个认证包教程http://mytechworld.officeacuity.com/index.php/2012/07/authentication-and-authorization-in-mvc-projects-using-ravendb/ 这似乎对我和我试着调整了一下。 .WaitForNonStaleResults()作为测试来确保我在查询时正在处理最新的文档集。 但是,我想知道,如果你可以提供我关于认证包的弃用的链接,因为我似乎无法找到任何文章陈述此类。再次感谢。 – jamesamuir

+1

还没有很多文件记录。我[请求](http://issues.hibernatingrhinos.com/issue/RDoc-81)他们添加了更好的身份验证选项的文档。它在[9月27日](https://github.com/ayende/ravendb/commit/70933e047cba50b560098b3b3d341a902cf0ed0e)和[api键](https://groups.google.com/group/ravendb/browse_thread/thread/d87a67d0b1a516c )大约在同一时间宣布。您可能想从[Raven.Contrib](https://github.com/ravendb/ravendb.contrib)查看Asp.Net身份验证提供程序,但它刚刚添加并且尚未完整记录。 –

+0

再次感谢,我非常感谢后续。 – jamesamuir