当前位置: 首页 > 知识库问答 >
问题:

使用Kudu API将带有serviceBusTrigger的azure函数部署到现有的函数应用程序中,即使在手动同步触发器后也不会触发

祁嘉瑞
2023-03-14

我有一个现有功能应用程序,在应用程序中的用户操作之后,我需要将serviceBusTrigger函数部署到该应用程序。为了做到这一点,我一直在使用下面的post Deploy Azure函数from code(C#)。

public void CreateAzureFunctionToMonitorQueue(string functionName, string serviceBusQueueName, string path)
    {
        // create zip of new function
        // ZipFile.CreateFromDirectory will create a zip with the directory's name containing the directory's contents
        // so CreateZipOfFunc creates a structure <functionName>/<functionName>/function.json
        // so that the zip contains <functionName>/function.json 
        // which is the required input for api/zip/ from kudu api
        var zipFile = CreateZipOfFunc(functionName, serviceBusQueueName, path);
        var file = File.ReadAllBytes(zipFile);

        MemoryStream stream = new MemoryStream(file);

        using (var client = new HttpClient())
        {
            // deploy zip using Kudu REST api
            client.DefaultRequestHeaders.Add("Authorization", "Basic " + _base64Auth);
            var baseUrl = new Uri($"https://{_webFunctionAppName}.scm.azurewebsites.net/");
            var requestURl = baseUrl + "api/zip/site/wwwroot";
            var httpContent = new StreamContent(stream);
            var response = client.PutAsync(requestURl, httpContent).Result;
        }
        // remove files
        Directory.Delete($"{path}{functionName}", true);
        File.Delete($"{path}{functionName}.zip");
        // deployment using Kudu REST api requires the function triggers to be manually synced
        SyncTriggers();
    }
public void SyncTriggers()
    {
        using (var client = new HttpClient())
        {
            var requestUrl = $"https://{_webFunctionAppName}.azurewebsites.net/admin/host/synctriggers?code={_MASTER_KEY}";
            var httpContent = new StringContent("");
            var response = client.PostAsync(requestUrl, httpContent).Result;
        }
    }

如果我启用已经存在的使用VS部署的函数,该函数将激发并处理消息。

现有函数的function.json文件如下所示

{
  "generatedBy": "Microsoft.NET.Sdk.Functions-1.0.26",
  "configurationSource": "attributes",
  "bindings": [
    {
      "type": "serviceBusTrigger",
      "connection": "ServiceBusConnection",
      "queueName": "myqueue",
      "name": "queueItem"
    }
  ],
  "disabled": false,
  "scriptFile": "../bin/MyProject.MyLibrary.dll",
  "entryPoint": "MyProject.MyLibrary.MyClass.RunAsync"
}

使用上述方法部署的函数具有如下所示的function.json

{
  "generatedBy": "Microsoft.NET.Sdk.Functions - 1.0.26",
  "configurationSource": "attributes",
  "bindings": [
    {
      "type": "serviceBusTrigger",
      "connection": "ServiceBusConnection",
      "queueName": "myqueue",
      "name": "queueItem"
    }
  ],
  "disabled": false,
  "scriptFile": "../bin/MyProject.MyLibrary.dll",
  "entryPoint": "MyProject.MyLibrary.MyClass.RunAsync"
}
Your endpoint must trigger/bind to only one Azure Function

编辑2:这似乎只是与az fns绑定资源有关,似乎没有帮助

Edit3:经过大量研究,看来我生成的function.json的configurationSource不应该是“attributes”,而应该是“config”。现在要测试这个。

Edit4:通过删除generatedBy并将我正在生成的function.json文件中的configurationSource更改为“config”,解决了这个问题。

共有1个答案

红朝
2023-03-14

问题是使用VS部署的函数在function.json中具有这两个属性

"generatedBy": "Microsoft.NET.Sdk.Functions - 1.0.26",
"configurationSource": "attributes",

这实际上只是告诉azure函数是从哪里生成的,并使用函数入口点方法的属性作为配置源。删除generatedBy允许编辑azure portal中的函数,并将configurationSource更改为“config”,告诉azure函数运行时使用function.json文件进行绑定配置。

但是,在azure门户中,我收到了一条消息

Error:

Function (MyFunction) Error: Configuration error: all functions in D:\home\site\wwwroot\bin\MyProject.MyLibrary.dll must have the same value for 'configurationSource'.
Session Id: MY_SESSION_ID

Timestamp: 2019-06-30T21:04:22.709Z

因此将output function.json更改为

{
  "configurationSource": "config",
  "bindings": [
    {
      "type": "serviceBusTrigger",
      "connection": "ServiceBusConnection",
      "queueName": "myqueue",
      "name": "queueItem"
    }
  ],
  "disabled": false,
  "scriptFile": "../bin/MyProject.MyLibrary.dll",
  "entryPoint": "MyProject.MyLibrary.MyClass.RunAsync"
}

解决了我的问题

 类似资料:
  • 在Azure中,我开发了一个函数(应用服务),当新的csv文件放入特定存储帐户时会触发该函数。该函数是在Azure中开发的,每次上传新的csv文件时都不会出现问题。但是考虑到CI/CD,我决定将我的开发过程从Azure迁移到Visual Studio(2017)。 代码在本地运行没有任何问题,但一旦我将代码发布到Azure(通过VSTS),挑战就开始了。当新的csv文件上传到存储帐户时,触发器似乎

  • 我已将 Azure 函数设置为运行 Blob 触发器,(因此,当将 Blob 添加到容器时,它应该触发)。在门户中打开函数应用之前,函数不会运行。然后,它将拾取已添加的任何 blob 并像往常一样处理它们。为什么需要在门户中打开函数应用才能启动我的作业?这几乎就像函数应用程序进入睡眠状态,然后在我浏览到它时唤醒。我该如何防止这种情况发生? 这是我的克朗

  • 有没有人知道某种方法可以触发具有 Blob 触发器的 Azure 函数?无论是通过API还是使用“测试/运行”功能。 情况是,我需要在测试目的中这样做。目前我看到的是,可以在blob存储中提供要触发的文件的名称。但这是无用的,因为无论如何,将文件放在那里都会触发功能。我想做的是为文件的内容而不是名称提供功能,以避免不必要的操作。 不幸的是,微软在所有相关主题上的留档很差,但这个没有。在这个gith

  • 我正在使用Python 3.x编写一个Azure timer触发器。我已经运行了一个这样的函数。我想我知道怎么做,从JS创建一个然后删除' index.js '并创建一个run.py,但这次,当我运行我的python函数时,我总是得到一个错误,说“没有这样的文件:index.js”。我没有看到函数和“index.js”文件之间有任何联系。 有什么想法吗?

  • 我正在尝试将托管标识与Azure功能V3和QueueTrigger一起使用。功能代码的定义如下: 根据微软留档这应该是可能的通过定义一些额外的配置属性 https://docs.microsoft.com/en-us/azure/azure-functions/functions-reference?tabs=blob#local-development-with-identity-based-c

  • 配置报警策略的时候open-falcon支持多种报警触发函数,比如all(#3) diff(#10)等等,这些#后面的数字表示的是最新的历史点。比如#3代表的是最新的三个点。 all(#3): 最新的3个点都满足阈值条件则报警 max(#3): 对于最新的3个点,其最大值满足阈值条件则报警 min(#3): 对于最新的3个点,其最小值满足阈值条件则报警 sum(#3): 对于最新的3个点,其和满足