Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.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
C# 如何指定与MassTransit一起使用的Azure服务总线主题_C#_Azureservicebus_Masstransit_Azure Servicebus Topics - Fatal编程技术网

C# 如何指定与MassTransit一起使用的Azure服务总线主题

C# 如何指定与MassTransit一起使用的Azure服务总线主题,c#,azureservicebus,masstransit,azure-servicebus-topics,C#,Azureservicebus,Masstransit,Azure Servicebus Topics,我已经尝试使用MassTransit在Azure服务总线中将消息发布到名为events的主题。我在配置MassTransit以使用预定义主题事件时遇到问题,它会为消息类型创建一个名称空间/类名命名的新主题。因此,我想知道如何指定使用哪个主题,而不是创建一个新主题 这是我测试过的代码: using System; using System.Threading.Tasks; using MassTransit; using MassTransit.AzureServiceBusTransport;

我已经尝试使用MassTransit在Azure服务总线中将消息发布到名为
events
的主题。我在配置MassTransit以使用预定义主题
事件
时遇到问题,它会为消息类型创建一个名称空间/类名命名的新主题。因此,我想知道如何指定使用哪个主题,而不是创建一个新主题

这是我测试过的代码:

using System;
using System.Threading.Tasks;
using MassTransit;
using MassTransit.AzureServiceBusTransport;
using Microsoft.ServiceBus;

namespace PublisherNameSpace
{
    public class Publisher
    {
        public static async Task PublishMessage()
        {
            var topic = "events";
            var bus = Bus.Factory.CreateUsingAzureServiceBus(
                cfg =>
                {
                    var azureServiceBusHost = cfg.Host(new Uri("sb://<busname>.servicebus.windows.net"), host =>
                    {
                        host.OperationTimeout = TimeSpan.FromSeconds(5);
                        host.TokenProvider =
                            TokenProvider.CreateSharedAccessSignatureTokenProvider(
                                "RootManageSharedAccessKey",
                                "<key>"
                            );
                    });

                    cfg.ReceiveEndpoint(azureServiceBusHost, topic, e =>
                    {
                        e.Consumer<TestConsumer>();
                    });
                });

            await bus.Publish<TestConsumer>(new TestMessage { TestString = "testing" });
        }
    }

    public class TestConsumer : IConsumer<TestMessage>
    {
        public Task Consume(ConsumeContext<TestMessage> context)
        {
            return Console.Out.WriteAsync("Consuming message");
        }
    }

    public class TestMessage
    {
        public string TestString { get; set; }
    }
}
使用系统;
使用System.Threading.Tasks;
使用大众运输;
使用MassTransit.azureServiceBustTransport;
使用Microsoft.ServiceBus;
命名空间发布者命名空间
{
公共类出版商
{
公共静态异步任务PublishMessage()
{
var topic=“事件”;
var bus=bus.Factory.CreateUsingAzureServiceBus(
cfg=>
{
var azureServiceBusHost=cfg.Host(新Uri(“sb://.servicebus.windows.net”),Host=>
{
host.OperationTimeout=TimeSpan.FromSeconds(5);
host.TokenProvider=
TokenProvider.CreateSharedAccessSignatureTokenProvider(
“RootManageSharedAccessKey”,
""
);
});
ReceiveEndpoint(azureServiceBusHost,主题,e=>
{
e、 消费者();
});
});
wait bus.Publish(新的TestMessage{TestString=“testing”});
}
}
公共类TestConsumer:IConsumer
{
公共任务消费(消费上下文)
{
返回控制台.Out.WriteAsync(“消费消息”);
}
}
公共类测试消息
{
公共字符串TestString{get;set;}
}
}

如果要使用特定主题,请创建订阅终结点而不是接收终结点,并在配置中指定主题和订阅名称

最简单的形式如单元测试所示:


接受的答案清除了订阅端:

cfg.SubscriptionEndpoint(
    host,
    "sub-1",
    "my-topic-1",
    e =>
    {
        e.ConfigureConsumer<TestConsumer>(provider);
    });
cfg.SubscriptionEndpoint(
主办
“sub-1”,
“我的主题1”,
e=>
{
e、 配置消费者(提供者);
});
对于那些想知道如何在发布端获得正确的总线配置的人,它应该如下所示:

cfg.Message<TestMessage>(x =>
{
    x.SetEntityName("my-topic-1");
});
cfg.Message(x=>
{
x、 SetEntityName(“my-topic-1”);
});
然后,您可以在总线上调用publish:

await bus.Publish<TestMessage>(message);
等待总线发布(消息);

感谢@ChrisPatterson的支持

我能够使用\u sendEndpointProvider.GetSendEndpoint(新Uri(“主题:形状”))发送到Azure服务总线主题哪里。。。“形状”是主题名称

public class MassTransitController : ControllerBase
{
    private readonly ILogger<MassTransitController> _logger;
    private readonly ISendEndpointProvider _sendEndpointProvider;

    public MassTransitController(ILogger<MassTransitController> logger, ISendEndpointProvider sendEndpointProvider)
    {
        _logger = logger;
        _sendEndpointProvider = sendEndpointProvider;
    }

    [HttpGet]
    public async Task<IActionResult> Get()
    {
        try
        {
            var randomType = new Random();
            var randomColor = new Random();

            var shape = new Shape();
            shape.ShapeId = Guid.NewGuid();
            shape.Color = ShapeType.ShapeColors[randomColor.Next(ShapeType.ShapeColors.Count)];
            shape.Type = ShapeType.ShapeTypes[randomType.Next(ShapeType.ShapeTypes.Count)];

            var endpoint = await _sendEndpointProvider.GetSendEndpoint(new Uri("topic:shape"));
            await endpoint.Send(shape);

            return Ok(shape);
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }
}
公共类MassTransitController:ControllerBase
{
专用只读ILogger\u记录器;
专用只读ISendEndpointProvider _sendEndpointProvider;
公共MassTransitController(ILogger记录器、ISendedPointProvider sendEndpointProvider)
{
_记录器=记录器;
_sendEndpointProvider=sendEndpointProvider;
}
[HttpGet]
公共异步任务Get()
{
尝试
{
var randomType=新的Random();
var randomColor=新随机数();
var shape=新形状();
shape.ShapeId=Guid.NewGuid();
shape.Color=ShapeType.ShapeColors[randomColor.Next(ShapeType.ShapeColors.Count)];
shape.Type=ShapeType.ShapeTypes[randomType.Next(ShapeType.ShapeTypes.Count)];
var endpoint=await_sendEndpointProvider.GetSendEndpoint(新Uri(“主题:形状”));
等待端点。发送(形状);
返回Ok(形状);
}
捕获(例外情况除外)
{
掷骰子;
}
}
}
我还能够让一个.NET5工作者消费者使用这样的代码。。。订阅“sub-all”将捕获所有形状。。我打算写一篇博客文章/git-repo

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureServices((hostContext, services) =>
            {
                services.AddMassTransit(x =>
                {
                    x.UsingAzureServiceBus((context, cfg) =>
                    {
                        cfg.Host("Endpoint=sb://******");

                        cfg.SubscriptionEndpoint(
                            "sub-all",
                            "shape",
                            e =>
                        {
                            e.Handler<Shape>(async context =>
                            {
                                await Console.Out.WriteLineAsync($"Shape Received: {context.Message.Type}");
                            });

                            e.MaxDeliveryCount = 15;
                        });
                    });
                });

                services.AddMassTransitHostedService();
            });
公共静态IHostBuilder CreateHostBuilder(字符串[]args)=>
Host.CreateDefaultBuilder(args)
.ConfigureServices((主机上下文,服务)=>
{
services.AddMassTransit(x=>
{
x、 使用AzuReserveCebus((上下文,cfg)=>
{
主机(“Endpoint=sb://*******”;
cfg.SubscriptionEndpoint(
“全部分包”,
“形状”,
e=>
{
e、 处理程序(异步上下文=>
{
wait Console.Out.WriteLineAsync($“收到的形状:{context.Message.Type}”);
});
e、 MaxDeliveryCount=15;
});
});
});
services.AddMassTransitHostedService();
});

谢谢,应该可以了。但是,在我的一项服务中,我仅限于MassTransit 3.3.5(由于旧的Newtonsoft.Json),其中没有引入SubscriptionEndpoint方法。是否可以指定在该版本中使用哪个主题?该版本不支持该主题。已更新。当然,一旦v7发布,它会再次改变。链接已经死了…谢谢,更新了。我不知道为什么官方文档不这么清楚。我觉得很难理解。