我花了几天时间测试MassTransit 3.1.2,看看我们是否可以在我们的应用程序中使用Azure Service Bus.
我使用MassTransit.AzureServiceBus(3.1.2)为两个控制台应用程序做了一个示例:一个发布者和一个suscriber.
它运作良好.当我启动应用程序时,Azure上的命名空间上会自动创建实体(队列,主题,订阅).
当你测试东西时,这很好,但在生产中,我不希望允许应用程序创建实体.我们想要提前创建它们.
为了尝试这一点,我认为使用只有“发送”或“监听”权限的SAS策略连接到总线是个好主意(在我使用具有“管理”权限的命名空间策略之前).
现在我在这一点上挣扎,我无法让它工作,我总是得到401错误如果我不使用具有“管理”权限的策略,则此操作需要管理声明.
我尝试直接在命名空间或实体上设置策略,但没有成功.
之后我分析了堆栈跟踪异常([…]省略了无用的部分):
System.UnauthorizedAccessException: Le serveur distant a retourné une erreur : (401) Non autorisé. Manage claim is required for this operation. TrackingId:2ca420e3-aac6-467c-bacb-6e051dbc3e39_G47,TimeStamp:1/29/2016 11:20:41 PM ---> System.Net.WebException: Le serveur distant a retourné une erreur : (401) Non autorisé.
à System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult)
à Microsoft.ServiceBus.Messaging.ServiceBusResourceOperations.GetAsyncResult`1.<GetAsyncSteps>b__3c(GetAsyncResult`1 thisPtr, IAsyncResult r)
à Microsoft.ServiceBus.Messaging.IteratorAsyncResult`1.StepCallback(IAsyncResult result)
--- Fin de la trace de la pile d'exception interne ---
Server stack trace:
Exception rethrown at [0]:
à Microsoft.ServiceBus.Common.ExceptionDispatcher.Throw(Exception exception)
à Microsoft.ServiceBus.Common.AsyncResult.End[TAsyncResult](IAsyncResult result)
à Microsoft.ServiceBus.Common.AsyncResult`1.End(IAsyncResult asyncResult)
à Microsoft.ServiceBus.Messaging.ServiceBusResourceOperations.EndGet[TEntityDescription](IAsyncResult asyncResult, String[]& resourceNames)
à Microsoft.ServiceBus.NamespaceManager.EndGetQueue(IAsyncResult result)
à System.Threading.Tasks.TaskFactory`1.FromAsyncCoreLogic(IAsyncResult iar, Func`2 endFunction, Action`1 endAction, Task`1 promise, Boolean requiresSynchronization)
--- Fin de la trace de la pile à partir de l'emplacement précédent au niveau duquel l'exception a été levée ---
[...]
à MassTransit.AzureServiceBusTransport.NamespaceManagerExtensions.<CreateQueueSafeAsync>d__1.MoveNext()
--- Fin de la trace de la pile à partir de l'emplacement précédent au niveau duquel l'exception a été levée ---
[...]
à MassTransit.AzureServiceBusTransport.Pipeline.PrepareReceiveQueueFilter.<Send>d__5.MoveNext()
--- Fin de la trace de la pile à partir de l'emplacement précédent au niveau duquel l'exception a été levée ---
[...]
à MassTransit.AzureServiceBusTransport.ServiceBusReceiveTransport.<>c__DisplayClass12_0.<<Receiver>b__0>d.MoveNext()
--- Fin de la trace de la pile à partir de l'emplacement précédent au niveau duquel l'exception a été levée ---
[...]
à MassTransit.Internals.Extensions.TaskExtensions.<WithCancellation>d__0`1.MoveNext()
--- Fin de la trace de la pile à partir de l'emplacement précédent au niveau duquel l'exception
[...]
à MassTransit.MassTransitBus.<StartAsync>d__30.MoveNext()
--- Fin de la trace de la pile à partir de l'emplacement précédent au niveau duquel l'exception a été levée ---
à System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
à MassTransit.MassTransitBus.<StartAsync>d__30.MoveNext()
--- Fin de la trace de la pile à partir de l'emplacement précédent au niveau duquel l'exception a été levée ---
à System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
à System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
à System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
à MassTransit.Util.TaskUtil.Await[T](Func`1 taskFactory, CancellationToken cancellationToken)
à MassTransit.MassTransitBus.MassTransit.IBusControl.Start()
我发现MassTransit.AzureServiceBusTransport.NamespaceManagerExtensions.CreateQueueSafeAsync这一行非常有趣,因为我能够查看MassTransit源代码,看看它在做什么.我看到它正在使用NamespaceManager进行一些调用来获取队列或主题.
由于这个类名为NamespaceManager,我认为这意味着你无论如何都需要“管理”权限.
为了尝试这一点,我使用Azure SDK创建了一个基本的控制台应用程序,使用仅具有侦听或发送权限的策略对NamespaceManager进行一些调用:我尝试的所有调用都出现了401错误.添加管理权限有效.
我在Azure文档中没有找到任何关于这个假设的内容,也许我错过了一些东西.
最后的问题:
有没有办法在Azure Service Bus上使用MassTransit只有Send或Listen策略?我错过了什么,而且我的方向错了吗?
最佳答案 由于MassTransit负责管理服务总线命名空间的拓扑,包括创建主题和队列以及创建和绑定订阅,因此需要管理权限.
虽然您可能认为手动创建生产中的所有内容并将该权限从应用程序中删除是一个好主意,但您总是会花时间弄清楚为什么生产中的某些内容会被破坏并使您的工程师感到沮丧.我从这个经验谈起 – 这就是我们需要获得许可的原因.
还有为总线管理创建的自动删除队列,这又需要管理权限.