【问题标题】:Is it possible to Pass Azure Function ServiceBusTrigger connection at runtime是否可以在运行时通过 Azure Function ServiceBusTrigger 连接
【发布时间】:2020-05-22 05:18:48
【问题描述】:

我的代码如下所示:

public class Startup : IWebJobsStartup
{

  public async void Configure(IWebJobsBuilder builder)
   {

   Get Connection string Via HTTP Service.

       ServiceBusConnectionString = jArray["connectionString"].ToString();

   }

}

我想通过 这样的连接

[FunctionName("FunctionTopicMessageLogger")]
        public  void Run([ServiceBusTrigger("topic", "FunctionTopicMessageLogger",Connection = **ServiceBusConnectionString** )]Message mySbMsg)
        {

        }

这是我第一次使用 Local.setting.json 文件

{
  "IsEncrypted": false,
  "Values": {

    "AzureWebJobsStorage": "UseDevelopmentStorage=true",
    "Connectinstring": " "

  }
} 

问题是连接只需要 Const Parameter (所以它不允许改变)所以我试图在 local.setting.json 中写入并尝试读取从那里开始,我第一次运行时遇到错误,从第二次开始连接,所以它工作正常。

我是不是做错了什么请指教。

【问题讨论】:

    标签: c# azure azure-functions azure-functions-runtime azure-function-app


    【解决方案1】:

    解决您的问题有两个重要部分。

    1. 在使用服务总线触发器创建 Azure 函数期间,您必须指定将用于检索连接字符串值的连接字符串参数的名称。在这种情况下,如果您键入“ServiceBusConnectionString”,则必须在“ConnectionStrings”部分的 local.settings.json 文件中添加此类配置参数:

      {
         "IsEncrypted": false,
         "Values": {
                      "AzureWebJobsStorage": "UseDevelopmentStorage=true",
                      "FUNCTIONS_WORKER_RUNTIME": "dotnet"
                    },
      
       "ConnectionStrings": {
                   "ServiceBusConnectionString": "xxx"
        }
      }
      
    2. 将函数部署到 Azure 后,应使用门户中的“配置”部分,并且应避免使用“local.settings.json”文件,因为它仅用于本地开发:

      李>

    我希望这会有所帮助。

    【讨论】:

    • 实际上我无法提供这样的服务,我在运行时使用 Rest api 获取此 Servicebus 连接字符串值。第一次它是一个空的配置文件。
    • 现在我明白了。让我解释。您尝试使用的方法是不好的做法。您应该将连接字符串存储在安全存储中,并且不应从外部 API 获取它们。首选方法是使用 Azure Key Vault 并从那里读取机密和连接字符串。请看这篇文章:daniel-krzyczkowski.github.io/…
    • 还有一件事。在这种情况下,连接字符串是在应用程序启动期间加载的,因此如果您想从 API 传递它,则必须更改 Function App 的整个结构,在这种情况下,您将无法直接使用绑定代码。
    • 这是一个创建主题订阅的内部api,这就是我在这里使用rest的原因,之后我将存储在key-value中。那么您的意思是该函数应该在开始之前知道 connectionString 吗?
    • 是的,在这种情况下,如果您使用服务总线绑定,您应该在应用程序启动时传递连接字符串(在下面的这种情况下会自动完成)。
    【解决方案2】:

    如果您打算使用来自local.settings.json 的密钥Connectionstring,那么您应该能够通过执行以下操作自动从那里获取值:

    public static void Run([ServiceBusTrigger("topic", "FunctionTopicMessageLogger", Connection = "connectionString")]string mySbMsg)
    

    Connection 的值是来自local.settings.json 文件的密钥的名称。

    【讨论】:

    • 这第一次不起作用,因为 local.setting.json 中的 connectionString 为空
    • @user3684911 在 local.settings.json 中是否为空?那么你什么时候填充它?
    • 在启动方法中它应该是动态的,所以我要在运行时写入这个值。
    • @user3684911 我明白了,那个 jArray 从哪里读取值?您是说每次启动应用程序时连接字符串都可能不同?
    • JArray 从 Rest Api 获取值,在函数启动时我创建了新订阅,以便第一次从 Http 服务获取连接字符串,之后我可以将它存储在任何可能在任何参数或 Json 中的位置文件,但功能不起作用。
    【解决方案3】:

    如果你没有很多不同的服务总线,你可以为你拥有的每个不同的连接字符串创建一个函数。

    每个函数在启动前都需要知道connectionString,并开始在服务总线中等待消息。

    如果必须动态执行此操作,则不必使用 Azure 函数,可以使用服务总线 SDK:

    这里你可以看到如何手动管理客户端:https://docs.microsoft.com/en-us/azure/service-bus-messaging/service-bus-dotnet-get-started-with-queues

    希望对你有帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-27
      • 2018-03-23
      • 2022-01-06
      • 2021-12-13
      • 1970-01-01
      • 2015-04-26
      • 1970-01-01
      • 2015-02-14
      相关资源
      最近更新 更多