我花了几天时间测试 MassTransit 3.1.2 ,看看我们是否可以在我们的应用程序中使用 Azure Service Bus 。
我使用MassTransit.AzureServiceBus(3.1.2)制作了一个包含两个控制台应用程序的示例:一个发布者和一个suscriber。
效果很好。当我启动应用程序时,Azure上的命名空间上会自动创建实体(队列,主题,订阅) 当你测试东西时,这很好,但在生产中,我不希望允许应用程序创建实体。我们想要提前创建它们。
为了尝试这一点,我认为使用SAS策略连接到总线是一个好主意,只有“发送”或“监听”权限(在我之前)使用带有“Manage”权限的命名空间策略。
现在我在这一点上挣扎,我无法让它工作,我总是得到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只有发送或侦听策略?我错过了什么,而且我的方向错了吗?
答案 0 :(得分:2)
由于MassTransit负责管理服务总线命名空间的拓扑,包括创建主题和队列以及创建和绑定订阅,因此需要管理权限。
虽然您可能认为手动创建生产中的所有内容并将该权限从您的应用程序中删除是一个好主意,但您总是会花时间弄清楚为什么生产中的内容被破坏并使您的工程师感到沮丧。我从这方面的经验谈起 - 这就是我们需要获得许可的原因。
还为总线管理创建了自动删除队列,这又需要管理权限。