Azure Function App v4 + .NET 6.0(处理中)+ Blob 绑定(未触发)= 无法将 Blob 绑定到类型错误

Azure Function App v4 + .NET 6.0 (in process) + Blob binding (not trigger) = Can't bind Blob to type error

即使在 hello world 函数中,我也无法使此组合正常工作。我想要一个消耗 table 和 blob 的函数,但不是作为触发器(触发器是计时器)。

当我在本地 运行 函数应用程序时,我得到

Microsoft.Azure.WebJobs.Host: Error indexing method 'Function1'. Microsoft.Azure.WebJobs.Host: Can't bind Blob to type 'Microsoft.WindowsAzure.Storage.Blob.CloudBlobContainer'.
Possible causes:
 1) Tried binding to 'Azure.Storage.Blobs.BlobContainerClient, Azure.Storage.Blobs, Version=12.10.0.0, Culture=neutral, PublicKeyToken=92742159e12e44c8' but user type assembly was 'Microsoft.WindowsAzure.Storage.Blob.CloudBlobContainer, Microsoft.WindowsAzure.Storage, Version=9.3.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35.
 2) Tried binding to 'Microsoft.Azure.WebJobs.Extensions.Storage.Blobs.Config.BlobsExtensionConfigProvider+MultiBlobContext, Microsoft.Azure.WebJobs.Extensions.Storage.Blobs, Version=5.0.0.0, Culture=neutral, PublicKeyToken=92742159e12e44c8' but user type assembly was 'Microsoft.WindowsAzure.Storage.Blob.CloudBlobContainer, Microsoft.WindowsAzure.Storage, Version=9.3.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35.
 3) Tried binding to 'System.IO.Stream, System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e' but user type assembly was 'Microsoft.WindowsAzure.Storage.Blob.CloudBlobContainer, Microsoft.WindowsAzure.Storage, Version=9.3.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35.
 4) Tried binding to 'Azure.Storage.Blobs.Specialized.BlockBlobClient, Azure.Storage.Blobs, Version=12.10.0.0, Culture=neutral, PublicKeyToken=92742159e12e44c8' but user type assembly was 'Microsoft.WindowsAzure.Storage.Blob.CloudBlobContainer, Microsoft.WindowsAzure.Storage, Version=9.3.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35.
 5) Tried binding to 'Azure.Storage.Blobs.Specialized.PageBlobClient, Azure.Storage.Blobs, Version=12.10.0.0, Culture=neutral, PublicKeyToken=92742159e12e44c8' but user type assembly was 'Microsoft.WindowsAzure.Storage.Blob.CloudBlobContainer, Microsoft.WindowsAzure.Storage, Version=9.3.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35.
 6) Tried binding to 'Azure.Storage.Blobs.Specialized.AppendBlobClient, Azure.Storage.Blobs, Version=12.10.0.0, Culture=neutral, PublicKeyToken=92742159e12e44c8' but user type assembly was 'Microsoft.WindowsAzure.Storage.Blob.CloudBlobContainer, Microsoft.WindowsAzure.Storage, Version=9.3.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35.
 7) Tried binding to 'Azure.Storage.Blobs.BlobClient, Azure.Storage.Blobs, Version=12.10.0.0, Culture=neutral, PublicKeyToken=92742159e12e44c8' but user type assembly was 'Microsoft.WindowsAzure.Storage.Blob.CloudBlobContainer, Microsoft.WindowsAzure.Storage, Version=9.3.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35.
 8) Tried binding to 'Azure.Storage.Blobs.Specialized.BlobBaseClient, Azure.Storage.Blobs, Version=12.10.0.0, Culture=neutral, PublicKeyToken=92742159e12e44c8' but user type assembly was 'Microsoft.WindowsAzure.Storage.Blob.CloudBlobContainer, Microsoft.WindowsAzure.Storage, Version=9.3.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35.

为了创建这个,我做了以下操作:

  1. 正在使用 .NET 6.0 创建新的函数应用程序项目
  2. 创建了以下函数:
using System;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Host;
using Microsoft.Extensions.Logging;
using Microsoft.WindowsAzure.Storage.Blob;
using Microsoft.WindowsAzure.Storage.Table;

namespace FunctionApp1
{
    public class Function1
    {
        [FunctionName("Function1")]
        public void Run(
            [TimerTrigger("0 */5 * * * *")] TimerInfo myTimer,
            [Blob("activity-events", Connection = "StorageAccountBlobEndpoint")] CloudBlobContainer cloudBlobContainer,
            ILogger log

        )
        {
            log.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}");
        }
    }
}

完整的 CSPROJ 是

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net6.0</TargetFramework>
    <AzureFunctionsVersion>v4</AzureFunctionsVersion>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Microsoft.Azure.WebJobs.Extensions.Storage" Version="4.0.5" />
    <PackageReference Include="Microsoft.NET.Sdk.Functions" Version="4.1.0" />
  </ItemGroup>
  <ItemGroup>
    <None Update="host.json">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </None>
    <None Update="local.settings.json">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      <CopyToPublishDirectory>Never</CopyToPublishDirectory>
    </None>
  </ItemGroup>
</Project>

我将来也想有一个 table 绑定,我知道这会排除 Microsoft.Azure.WebJobs.Extensions.Storage 的 V 5.X。

我可能遗漏了一些基本的东西,但如果有人能识别我将不胜感激。

由于您的 input/trigger 绑定是一个计时器,您是否正在查看 blob 和 table 输出绑定?

看看这个文档:https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-storage-blob-output?tabs=in-process%2Cextensionv5&pivots=programming-language-csharp

我相信一些事情:

            public class Function1
{
    [FunctionName("Function1")]
    public void Run([TimerTrigger("0 */5 * * * *")]TimerInfo myTimer, 
        [Blob("activity-events", FileAccess.Write, Connection = "MyBlobConnString")] out Stream myblob,
        ILogger log)
    {
        log.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}");

        //DO SOMETHING WITH myBlob before function exits
    }
}

好吧,正如预期的那样,它似乎相当简单 - 我没有从 Microsoft.WindowsAzure.Storage.Blob 引用 CloudBlobContainer,而是从 Microsoft.Azure.Cosmos.Table.[=13= 引用它]

旁注:这打开了一个巨大的潘多拉魔盒,里面装满了我现在需要在这个现有解决方案中修复的其他东西。