如何解决ServiceBusConnectionException - 接收传输出错
在我的函数 bus.Start();
上使用 azure StartService()
启动大众运输时出现以下错误 我已经使用大众运输和 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 需要 Manage,并且您正在配置托管身份令牌提供程序。
- 从连接字符串中删除共享访问凭据,因为它们会与托管身份提供程序发生冲突。
- 确保服务标识对命名空间具有管理权限。
好吧,问题出在令牌提供者身上。
问题是生成的令牌连接到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"),"xxxxxxxxxxxxxxxxxxxxxx")
};
conf.Host(settings);
conf.ReceiveEndpoint("team-time-manager",e =>
{
e.ConfigureConsumer<TeamTimeManager>(context);
});
conf.ConfigureEndpoints(context);
});
});
return builder.Build();
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。