Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 从Azure服务上的服务总线处理程序接收事件网格_.net_Azure_Azureservicebus_Azure Eventgrid - Fatal编程技术网

.net 从Azure服务上的服务总线处理程序接收事件网格

.net 从Azure服务上的服务总线处理程序接收事件网格,.net,azure,azureservicebus,azure-eventgrid,.net,Azure,Azureservicebus,Azure Eventgrid,我正在事件网格上发送事件,如。我可以看到他们到达azure仪表板 NomeEmailChange yay = new NomeEmailChange { Nome = "cesco", Email = "cesco" }; var primaryTopicKey = _config["EventGridConfig:AcessKey"]

我正在事件网格上发送事件,如。我可以看到他们到达azure仪表板

            NomeEmailChange yay = new NomeEmailChange
            {
                Nome = "cesco",
                Email = "cesco"
            };

            var primaryTopicKey = _config["EventGridConfig:AcessKey"];
            var primaryTopic = _config["EventGridConfig:Endpoint"];

            var primaryTopicHostname = new Uri(primaryTopic).Host;

            var topicCredentials = new TopicCredentials(primaryTopicKey);
            var client = new EventGridClient(topicCredentials);

            var id = Guid.NewGuid().ToString();
            var hey = new List<EventGridEvent>
            {
                new EventGridEvent()
                {
                    Id = id,
                    EventType = "cesco-cesco",
                    Data = (yay),
                    EventTime = DateTime.Now,
                    Subject = "MS_Clientes",
                    DataVersion = "1.0",
                }
            };
            ;
            client.PublishEventsAsync(primaryTopicHostname, hey);
NomeEmailChange yay=新的NomeEmailChange
{
Nome=“cesco”,
电子邮件=“cesco”
};
var primaryTopicKey=_config[“EventGridConfig:AcessKey”];
var primaryTopic=_config[“EventGridConfig:Endpoint”];
var primaryTopicHostname=新Uri(primaryTopic).Host;
var topicCredentials=新的topicCredentials(primaryTopicKey);
var client=新的EventGridClient(topicCredentials);
var id=Guid.NewGuid().ToString();
var-hey=新列表
{
新EventGridEvent()
{
Id=Id,
EventType=“cesco cesco”,
数据=(耶),
EventTime=DateTime。现在,
Subject=“MS_客户”,
DataVersion=“1.0”,
}
};
;
PublishEventsAsync(primaryTopicHostname,hey);
然后我创建了一个事件网格订阅。我可以确认到达事件网格订阅的事件网格消息

在另一个项目中,我订阅了下面的服务总线。它可以很好地使用直接发送到总线的消息

        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.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;
        }
公共静态IServiceCollection AddBus(此IServiceCollection服务,IConfiguration配置,
IHostingEnvironment(环境)
{
services.AddMassTransit(x=>{x.AddConsumer();});
services.AddSingleton(provider=>Bus.Factory.createUsingAzuReserveCebus(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=“+机密,
z=>
{
令牌提供者
.CreateSharedAccessSignatureTokenProvider(密钥名,机密);
});
UseExtensionsLogging(provider.GetService());
ReceiveEndpoint(主机,配置[“ServiceBus:Topic”],
e=>{e.Consumer(provider);});
}));
services.AddSingleton(provider=>provider.GetRequiredService());
services.AddSingleton(provider=>provider.GetRequiredService());
services.AddSingleton(provider=>provider.GetRequiredService());
services.addScope(provider=>provider.GetRequiredService().CreateRequestClient());
services.AddSingleton();
返回服务;
}
现在所有这些都应该可以工作了,但是在另一个项目中,当消息到达时,我得到了以下错误

fail: MassTransit.Messages[0]
      R-FAULT sb://sbacompanharreldev.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)
失败:MassTransit.Messages[0]
R-FAULT sb://sbacompanharreldev.servicebus.windows.net/bff-queue 9ade19ec-238c-4c08-8e03-28bac695ea7b未为消息内容类型注册反序列化程序:application/json;字符集=utf-8。支持的内容类型包括application/vnd.masstransit+json、application/vnd.masstransit+bson、application/vnd.masstransit+xml
System.Runtime.Serialization.SerializationException:未为消息内容类型注册反序列化程序:application/json;字符集=utf-8。支持的内容类型包括application/vnd.masstransit+json、application/vnd.masstransit+bson、application/vnd.masstransit+xml
在MassTransit.Serialization.SupportedMessageDeserializers.Deserialize(ReceiveContext ReceiveContext)
在MassTransit.Pipeline.Filters.DeserializeFilter.Send处(ReceiveContext上下文,IPipe`1 next)
在GreenPipes.Filters.RescueFilter`2.GreenPipes.IFilter.Send(TContext上下文,IPipe`1下一步)

MassTransit正在使用用于反序列化内容的消息信封。
您需要创建并注册自定义序列化程序,以允许MassTransit接收和处理您的邮件。有关更多信息,请参阅文档。创建自定义序列化程序后,可以使用。

注册它,建议您编写自定义反序列化程序。在我的实现中,我对如何处理MassTransit包做了一些更改

首先,您必须为不同的内容类型注册反序列化程序:

  • 例如,如果您的邮件来自MassTransit publisher,则它将是默认的邮件内容类型(在C中):
    JsonMessageSerializer.JsonContentType
  • 如果您的消息来自ServiceBus队列/主题,则通常是
    “application/json”
  • 下面的代码显示了如何注册反序列化程序,以及如何设置接收端点。与您的方法相比的一个区别是我使用了连接字符串,所以不需要SAS令牌部分

    class Program
        {
            static string ContentTypeJson = "application/json";
            static async Task Main(string[] args)
            {
                var bus = Bus.Factory.CreateUsingAzureServiceBus(cfg =>
                {
                    var queueName = "Your SB Queue Name";
                    var connectionString = "Connection String with RooTManage policy";
                    var host = cfg.Host(connectionString, h =>
                    {
                        h.OperationTimeout = TimeSpan.FromSeconds(60);
                    });
    
                    cfg.ReceiveEndpoint(queueName,
                        e =>
                        {
                            e.AddMessageDeserializer(contentType: new ContentType(ContentTypeJson), () =>
                            {
                                return new EventGridMessgeDeserializer(ContentTypeJson);
                            });
                            e.Consumer(() => new EventGridMessageConsumer());
    
                            // Uncomment if required deserializer for local messages - mass transit as publisher or direct messages from SB
                            //e.AddMessageDeserializer(contentType: JsonMessageSerializer.JsonContentType, () =>
                            //{
                            //    return new CustomMessageDeserializer(JsonMessageSerializer.JsonContentType.ToString());
                            //});
                            //e.Consumer(() => new MessageConsumer());
                        });
    
                });
                bus.Start();
    
                Console.WriteLine("Press any key to exit");
                // for testing purposes of local messages - mass transit as publisher
                // await bus.Publish<CustomMessage>(new {  Hello = "Hello, World." });
                await Task.Run(() => Console.ReadKey());
    
                await bus.StopAsync();
    
            }
    
    类程序
    {
    静态字符串ContentTypeJson=“application/json”;
    静态异步任务主(字符串[]args)
    {
    var bus=bus.Factory.CreateUsingAzureServiceBus(cfg=>
    {
    var queueName=“您的SB队列名称”;
    var connectionString=“具有根管理策略的连接字符串”;
    var host=cfg.host(connectionString,h=>
    {
    h、 操作超时=从秒开始的时间跨度(60);
    });
    cfg.ReceiveEndpoint(队列名称,
    e=>
    {
    e、 AddMessageDeserializer(contentType:new contentType(ContentTypeJson),()=>
    {
    返回新的EventGridMessgeDeserializer(ContentTypeJson);
    });