我在localhost:8080上设置了一个RavenDB服务实例,并使用OAuth插件存储一个简单的用户文档进行身份验证。我使用guid作为id和用户的电子邮件作为名称。以下代码正常运行以存储用户
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工作室,我可以看到用户和名称正是我输入它的方式(我甚至将其复制并粘贴到文本字段中)。
我已经尝试停止并重新启动服务,希望能够解决问题,但事实并非如此。
我想知道是否有人可以指出我如何调试这里发生的事情。完整的代码库可以在这里找到
https://github.com/jamesamuir/MVC_Facebook_Auth
如果有人愿意下载它。
提前致谢。
答案 0 :(得分:1)
好吧,我发现您提供的代码示例存在很多问题 - 例如客户端和服务器版本不匹配。此外,身份验证包是一个1.0功能,已在2.0中弃用,这几乎是最终的,因此您正在编写最终必须替换的代码。
但是要回答你的问题,你无法从查询中得到结果的具体原因是你选择使用以“Raven /”开头的文档密钥,这是RavenDB系统文档的惯例 - 得到索引。
如果您从ID中删除“Raven /”,它将会有效。
此外,您不应该使用.WaitForNonStaleResults()
- 这仅适用于单元测试,并且在生产中是危险的。如果您真的觉得需要等待,请使用.WaitForNonStaleResultsAsOfNow()
- 这样更安全,因为它提供了截止。