ServiceBusConnectionException - 接收传输错误

ServiceBusConnectionException - Receive Transport faulted

当我在我的函数中使用 azure bus.Start(); 启动 masstransit 时出现以下错误 StartService() 我已经使用 masstransit 和 autofact 配置了我的 azure。错误:

MassTransit.Azure.ServiceBus.Core.ServiceBusConnectionException
  HResult=0x80131500
  Message=ReceiveTransport faulted: sb://softbaire-amilkar.servicebus.windows.net/;SharedAccessKeyName=**REMOVED**;SharedAccessKey=**REMOVED**/TeamTimeManager
  Source=mscorlib

公共交通配置:

public static IContainer ConfigureContainer()
{
    var builder = new ContainerBuilder();
    builder.AddMassTransit(cfg =>
    {
        cfg.SetKebabCaseEndpointNameFormatter();

        cfg.AddConsumer<TeamTimeManager>();

        cfg.UsingAzureServiceBus((context, conf) =>
        {
            var settings = new HostSettings
            {
                ServiceUri = new Uri("sb://softbaire-amilkar.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=UeIC0z5RPCt25SjnWdss2ssP5a6msUKNJxmLnBpm26g="),
                TokenProvider = TokenProvider.CreateManagedIdentityTokenProvider()
            };

            conf.Host(settings);

            conf.ConfigureEndpoints(context);
        });
    });

    return builder.Build();
}

这是我启动服务的地方,我收到错误:

public void StartService()
{
    var container = CreatorContainer.ConfigureContainer();
    var bus = container.Resolve<IBusControl>();

    if (host != null)
    {
        host.Close();
    }

    host = new ServiceHost(typeof(TeamTimeManager));
    utilHost = new ServiceHost(typeof(TeamTimeUtilityManager));

    bus.Start();
    source.TraceInformation("Starting TeamTimeManager Azure Bus...");

    host.Open();
    source.TraceInformation("TeamTimeManager Started!");

    utilHost.Open();
    utilSource.TraceInformation("Starting TeamTimeUtilityManager...");
}

更新

当我在以下行发表评论时,此问题已解决:

cfg.AddConsumer<TeamTimeManager>();

如果我添加队列或订阅,问题会再次出现

BUG

https://github.com/Azure/azure-sdk-for-net/issues/8627

可能是权限问题。 MassTransit 需要管理,而您正在配置托管身份令牌提供程序。

  1. 从连接字符串中删除共享访问凭据,因为它们会与托管身份提供程序发生冲突。
  2. 确保服务身份对命名空间具有管理权限。

嗯,问题出在令牌提供者中。

问题是生成的令牌连接到 azure 但没有任何队列或主题注册,当我想注册队列和主题时,当我想生成与队列或主题的连接时,问题就开始了出现错误,因为令牌对我的用户无效(很奇怪),所以...我更改了生成令牌的方法,一切都开始正常工作。

之前:

var settings = new HostSettings
{
   ServiceUri = new Uri("sb://xxxx-busazure.servicebus.windows.net"),
   TokenProvider = TokenProvider.CreateManagedIdentityTokenProvider()
};

之后: 现在我正在使用 CreateSharedAccessSignatureTokenProvider() 您需要将“SharedAccessKeyName”和“SharedAccessKey”作为参数发送

var settings = new HostSettings
{
   ServiceUri = new Uri("sb://xxxxx-busazure.servicebus.windows.net"),
   TokenProvider = TokenProvider.CreateSharedAccessSignatureTokenProvider("RootManageSharedAccessKey", "xxxxxxxxxxxxxxx=")
};

排队,一切运行顺利,最终配置方法:

        public static IContainer ConfigureContainer()
        {
            var builder = new ContainerBuilder();

            builder.AddMassTransit(cfg =>
            {
                cfg.SetKebabCaseEndpointNameFormatter();
                cfg.AddServiceBusMessageScheduler();

                cfg.AddConsumer<TeamTimeManager>();
                
                cfg.UsingAzureServiceBus((context, conf) =>
                {
                    conf.UseServiceBusMessageScheduler();

                    var settings = new HostSettings
                    {
                       ServiceUri = new Uri("sb://amilkar-busazure.servicebus.windows.net"),
                       TokenProvider = TokenProvider.CreateSharedAccessSignatureTokenProvider("RootManageSharedAccessKey", "xxxxxxxxxxxxxxxxxxxxxx")
                    };
                    conf.Host(settings);

                    conf.ReceiveEndpoint("team-time-manager", e =>
                    {
                        e.ConfigureConsumer<TeamTimeManager>(context);
                    });

                    conf.ConfigureEndpoints(context);
                });

            });

            return builder.Build();
        }