【发布时间】:2020-03-25 04:45:56
【问题描述】:
这就是我将对象发布到事件网格的方式。我希望能够使用 azure 服务总线来收听它。
public void Publicar<T>(T model, string operation, string entity)
{
_nomeEvento = entity + operation;
Boolean.TryParse(Configuration["EventGridConfig:Enabled"], out var eventGridIsActive);
if (!eventGridIsActive)
return;
var primaryTopicKey = Configuration["EventGridConfig:AcessKey"];
var primaryTopic = Configuration["EventGridConfig:Endpoint"];
var primaryTopicHostname = new Uri(primaryTopic).Host;
var topicCredentials = new TopicCredentials(primaryTopicKey);
var client = new EventGridClient(topicCredentials);
client.PublishEventsAsync(primaryTopicHostname, GetEventsList(model)).GetAwaiter().GetResult();
}
private List<EventGridEvent> GetEventsList<T>(T model)
{
return new List<EventGridEvent>
{
new EventGridEvent()
{
Id = Guid.NewGuid().ToString(),
EventType = _nomeEvento,
Data = model,
EventTime = DateTime.Now,
Subject = "MS_Clientes",
DataVersion = "1.0",
}
};
}
这就是我连接到服务总线的方式
static class CustomExtensionsMethods
{
public static IServiceCollection AddBus(this IServiceCollection services, IConfiguration configuration,
IHostingEnvironment env)
{
services.AddMassTransit(x => { x.AddConsumer<NomeEmailChangeConsumer>(); });
services.AddSingleton(provider => Bus.Factory.CreateUsingAzureServiceBus(cfg =>
{
var keyName = "RootManageSharedAccessKey";
var busName = configuration["ServiceBus:Name"];
var secret = configuration["ServiceBus:Secret"];
var host = cfg.Host(
"Endpoint=sb://" + busName + ".servicebus.windows.net/;" +
"SharedAccessKeyName=" + keyName + ";" +
"SharedAccessKey=" + secret,
z =>
{
TokenProvider
.CreateSharedAccessSignatureTokenProvider(keyName, secret);
});
cfg.ConfigureJsonSerializer(settings =>
{
settings.Converters.Add(new InterfaceConverter());
return settings;
});
cfg.UseExtensionsLogging(provider.GetService<ILoggerFactory>());
cfg.ReceiveEndpoint(host, configuration["ServiceBus:Topic"],
e => { e.Consumer<NomeEmailChangeConsumer>(provider); });
}));
services.AddSingleton<IPublishEndpoint>(provider => provider.GetRequiredService<IBusControl>());
services.AddSingleton<ISendEndpointProvider>(provider => provider.GetRequiredService<IBusControl>());
services.AddSingleton<IBus>(provider => provider.GetRequiredService<IBusControl>());
services.AddScoped(provider => provider.GetRequiredService<IBus>().CreateRequestClient<NomeEmailChange>());
services.AddSingleton<IHostedService, BusService>();
return services;
}
}
然后我得到同样的错误
fail: MassTransit.Messages[0]
R-FAULT sb://dev.servicebus.windows.net/bff-queue 9ade19ec-238c-4c08-8e03-28bac695ea7b No deserializer was registered for the message content type: application/json; charset=utf-8. Supported content types include application/vnd.masstransit+json, application/vnd.masstransit+bson, application/vnd.masstransit+xml
System.Runtime.Serialization.SerializationException: No deserializer was registered for the message content type: application/json; charset=utf-8. Supported content types include application/vnd.masstransit+json, application/vnd.masstransit+bson, application/vnd.masstransit+xml
at MassTransit.Serialization.SupportedMessageDeserializers.Deserialize(ReceiveContext receiveContext)
at MassTransit.Pipeline.Filters.DeserializeFilter.Send(ReceiveContext context, IPipe`1 next)
at GreenPipes.Filters.RescueFilter`2.GreenPipes.IFilter<TContext>.Send(TContext context, IPipe`1 next)
我尝试添加一个我在网上找到的 JsonConverter,但没有成功
public class InterfaceConverter : JsonConverter
{
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
serializer.Serialize(writer, value);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue,
JsonSerializer serializer)
{
// Set TypeNameHandling to Auto for deserializing objects with $type
// Should be set directly in ConfigureJsonDeserializer when setting up MT Service bus
serializer.TypeNameHandling = TypeNameHandling.Auto;
return serializer.Deserialize(reader);
}
public override bool CanConvert(Type objectType)
{
return objectType.IsInterface;
}
}
【问题讨论】:
-
您的情况并非一切都清楚。在您的代码示例中,我看到
MassTransit,但您没有在任何地方提到它。你是故意用的吗? -
我看到您正在尝试使用
EventGridClient写入事件网格并为服务总线进行一些MassTransit注册。它不匹配或图片中的某些内容丢失。 -
弗拉德,我正在尝试将服务总线用作事件网格订阅处理程序。这是一个完全有效的场景。我收到事件就好了,我只需要一种反序列化的方法
-
我真的很想了解用例。我不知道
MassTransit是什么。我看到你写的是application/json,但读的是application/vnd.masstransit+json。应该有一个从你的问题中不清楚的原因。云请详细说明。
标签: json azure azureservicebus json-deserialization azure-eventgrid