有没有人尝试(并成功)使用Raven DB .Net客户端从RavenDB中获取订阅?
有一些Json序列化问题,当以下运行时,它会抛出
“将值”Subscriber.Messages.Events.MyEvent,Version = 1.0.0.0“转换为输入'NServiceBus.Unicast.Subscriptions.MessageType'。消息
代码很简单:
var documentStore = new DocumentStore
{
Url = "http://localhost:8080/",
DefaultDatabase = "publisher",
};
documentStore.Initialize();
using (var session = documentStore.OpenSession())
{
return session.Query<NServiceBus.Unicast.Subscriptions.Raven.Subscription>("Raven/DocumentsByEntityName").ToArray();
}
这肯定是一个序列化问题,因为检索工作。正如它使用下面的替代方案:
session.Advanced.LuceneQuery<Subscription>("Raven/DocumentsByEntityName").QueryResult.Results[0]
在RaveDB工作室中,我可以在发布者数据库中看到以下文档。
{
"MessageType": "Subscriber.Messages.Events.MyEvent, Version=1.0.0.0",
"Clients": [
{
"Queue": "samplesubscriber",
"Machine": "myDesktopHere"
}
]
}
将值“Subscriber.Messages.Events.MyEvent,Version = 1.0.0.0”转换为“NServiceBus.Unicast.Subscriptions.MessageType”时出错。
任何人都知道序列化失败的原因?
我正在使用NServiveBus.Host 4.2,Raven-DB客户端1.0.616和Newtonsoft.json 4.0.5。
顺便提一下,我使用dotpeek提取了类型并创建了本地版本。我从NSB dll创建了我自己的Subcription,MessageType,MessageTypeConvertor。然后我设法将字符串反序列化而没有问题。有什么想法吗?
修改
根据建议,先前的Lucene查询可以很好地检索结果。但随后反序列化失败了。例如,搜索结果在第一行中返回,但无法在return语句中进行deserlize。我从NSB dll中提取了本地版本的Subscription类型,并实现了类型转换器,再次从NSB库中拉出来,并使用那些代替NServiceBus.Unicast.Subscriptions.Raven.Subscription工作正常。不可避免地,这不是一个稳定的选择。
var searchResults = session.Advanced.LuceneQuery<NServiceBus.Unicast.Subscriptions.Raven.Subscription>("Raven/DocumentsByEntityName").WhereEquals("Tag", "Subscription").QueryResult.Results;
return searchResults.Select(subscriptionJsonObject => JsonConvert.DeserializeObject<NServiceBus.Unicast.Subscriptions.Raven.Subscription>(subscriptionJsonObject.ToString())).ToList();
还有什么想法?
答案 0 :(得分:-1)
使用此表单查询时:
session.Query<Entity>("IndexName")
您要求从查询中返回该索引的所有项,然后告诉RavenDB客户端将它们 all 反序列化为您指定的类型。< / p>
通常情况下,这很好,因为将为您正在使用的类型构建特定索引。例如,您通常会为特定目的构建自己的订阅索引,并查询:
session.Query<Subscription>("Subscriptions/ByWhatever")
或者如果您从C#构建索引,您可能希望使用此语法来避免使用字符串:
session.Query<Subscription, Subscriptions_ByWhatever>()
您也可以让Raven自动为您构建索引:
session.Query<Subscription>()
由于您使用了内置的Raven/DocumentsByEntityName
索引,因此您将返回数据库中的所有文档,而不仅仅是订阅的文档。由于只有一些可以反序列化为Subscription
类型,因此其他类型的序列化错误失败。
如果您想继续使用该索引,则需要将其过滤为该类型的索引:
session.Advanced.LuceneQuery<Subscription>("Raven/DocumentsByEntityName")
.WhereEquals("Tag", "Subscriptions")
此处LuceneQuery
表单更容易,因为您按字符串名称过滤字段。
您可以使用常规LINQ查询,但是您必须创建一个包含Tag
字段的类型,如下所示:
class RDBENIndexEntry
{
public string Tag { get; set; }
}
...
session.Query<RDBENIndexEntry>("Raven/DocumentsByEntityName")
.Where(x => x.Tag == "Subscriptions").OfType<Subscription>()