Skip to main content
 首页 » 编程设计

c#之WebJob ServiceBus 主题权限

2024年01月26日3252php

我参与了一个多层项目,其中一部分是使用来自第三方系统的“事件”流。供应商通过 Azure 服务总线主题发布这些——他们提供、控制和管理总线。我们只需提供 URI、主题名称和订阅详细信息。

我们的方法是将一个 Webjob 放在一起,使用 SDK 中提供的 ServiceBusTrigger 来处理新消息的监听并触发将它们处理到我们的系统中。然而,我们似乎遇到了障碍,因为作业不断地无法从主题中读取。作业因模糊的超时异常而失败:

Unhandled Exception: System.TimeoutException: The timeout elapsed upon attempting to obtain a token while accessing 'https://****-sb.accesscontrol.windows.net/WRAPv0.9/'.  
---> System.IdentityModel.Tokens.SecurityTokenException: The token provider was unable to provide a security token while accessing 'https://****-sb.accesscontrol.windows.net/WRAPv0.9/'.  
Token provider returned message: 'The operation has timed out'. 

但再往下,痕迹包括:

[ERR] at Microsoft.ServiceBus.Common.AsyncResult.End[TAsyncResult](IAsyncResult result) 
[ERR] at Microsoft.ServiceBus.NamespaceManager.OnEndTopicExists(IAsyncResult result) 
[ERR] at Microsoft.ServiceBus.NamespaceManager.EndTopicExists(IAsyncResult result) 

供应商随后确认订阅对主题的唯一许可/声明是Listen

谁能确认ServiceBusTrigger 的权限要求是什么?

作为 +1,假设无论出于何种原因,它需要更多的Listen(即需要Manage),有人愿意提出替代方案吗方法?失去 WebJob 基础设施似乎是一种耻辱(该项目已经有 3 个其他工作)——尤其是失去像主题消息的异步和并发处理这样的特性

请您参考如下方法:

为了解决这个问题,我们对 WebJobs SDK 进行了建议的更改(此处的拉取请求:https://github.com/Azure/azure-webjobs-sdk/pull/528)。这将在下一个版本中。以下是您如何指定每个属性的访问权限的示例:

public static void JobFunction( 
    [ServiceBusTrigger("inputqueue", AccessRights.Listen)] string message, 
    [ServiceBus("outputqueue", AccessRights.Send)] out string message) 
{ 
    . . . 
} 

未指定时,默认为“管理”。当设置为管理以外的任何内容时,SDK 将不会尝试创建任何 SB 资源。我认为这可以满足您的需求?