C# Azure服务总线,包含具有抽象正文的消息
我正在使用Azure主题和订阅作为消息总线。但是当我执行message.GetBody()时,我遇到了一个序列化异常。我想要实现的是,有一个订阅服务器读取BaseEvent类型的所有事件,并且每个事件都有自己的订阅服务器。但是当我尝试序列化主体(BaseEvent)时,它失败了。那么,如何序列化主体以获取UserEvent和TeamEvent呢?我的代码如下所示:C# Azure服务总线,包含具有抽象正文的消息,c#,azureservicebus,azure-sdk-.net,C#,Azureservicebus,Azure Sdk .net,我正在使用Azure主题和订阅作为消息总线。但是当我执行message.GetBody()时,我遇到了一个序列化异常。我想要实现的是,有一个订阅服务器读取BaseEvent类型的所有事件,并且每个事件都有自己的订阅服务器。但是当我尝试序列化主体(BaseEvent)时,它失败了。那么,如何序列化主体以获取UserEvent和TeamEvent呢?我的代码如下所示: public abstract class BaseEvent { public long ActivityId { get
public abstract class BaseEvent
{
public long ActivityId { get; set; }
}
public class UserEvent
{
public string Name { get; set; }
}
public class TeamEvent
{
public string Name { get; set; }
}
public async Task HandleAsync(BaseEvent request)
{
var message = new BrokeredMessage(request)
{
CorrelationId = request.Id.ToString()
};
await topicClient.SendAsync(message);
await topicClient.CloseAsync();
}
BrokeredMessage message;
while ((message = client.Receive(new TimeSpan(0, 0, 5))) != null)
{
models.Add(message.GetBody<BaseEvent>()); // THIS FAILS SerlizationException
message.Complete();
}
我将它们添加到消息总线中,如下所示:
public abstract class BaseEvent
{
public long ActivityId { get; set; }
}
public class UserEvent
{
public string Name { get; set; }
}
public class TeamEvent
{
public string Name { get; set; }
}
public async Task HandleAsync(BaseEvent request)
{
var message = new BrokeredMessage(request)
{
CorrelationId = request.Id.ToString()
};
await topicClient.SendAsync(message);
await topicClient.CloseAsync();
}
BrokeredMessage message;
while ((message = client.Receive(new TimeSpan(0, 0, 5))) != null)
{
models.Add(message.GetBody<BaseEvent>()); // THIS FAILS SerlizationException
message.Complete();
}
当我在车上看书时,我喜欢这样:
public abstract class BaseEvent
{
public long ActivityId { get; set; }
}
public class UserEvent
{
public string Name { get; set; }
}
public class TeamEvent
{
public string Name { get; set; }
}
public async Task HandleAsync(BaseEvent request)
{
var message = new BrokeredMessage(request)
{
CorrelationId = request.Id.ToString()
};
await topicClient.SendAsync(message);
await topicClient.CloseAsync();
}
BrokeredMessage message;
while ((message = client.Receive(new TimeSpan(0, 0, 5))) != null)
{
models.Add(message.GetBody<BaseEvent>()); // THIS FAILS SerlizationException
message.Complete();
}
代理消息;
while((message=client.Receive(new TimeSpan(0,0,5)))!=null)
{
models.Add(message.GetBody());//此操作失败SerlizationException
message.Complete();
}
作为声明:
public BrokeredMessage(
Object serializableObject
)
它使用带有二进制XmlDictionaryWriter的DataContractSerializer从给定对象初始化BrokeredMessage类的新实例。因此,类BaseEvent必须支持DataContractSerializer。至于怎么做,请参考我已经试过了,但还是出现了同样的错误。并将KnownType属性添加到BaseEvent。