使用 VS 2022 的 Azure Function v1 与 Azurite 与 AzureStorageEmulator 的冲突

Azure Function v1 using VS 2022 Conflict with Azurite vs AzureStorageEmulator

VS 2022 运行 Azure Function v1 可以运行吗?我们正在尝试从 VS2019 迁移到 VS2022,但 Function 项目无法正确 运行。似乎当 运行 连接它时,我们得到与文件名绑定相关的错误(因为它是 Azure Function v1,试图解析为 v2+)。

错误 Microsoft.Azure.WebJobs.Host: Exception binding parameter 'filename'. Microsoft.Azure.WebJobs.Host: Binding data does not contain expected value 'filename'.

当我停止 Azurite 并启动 AzureStorageEmulator 时,它 运行 成功了。但是似乎没有办法在项目中配置它。我将服务依赖项配置为使用 AzureStorageEmulator,但 Azurite 仍在启动。它似乎忽略了 AzureStorageEmulator 服务依赖。

我们发现的唯一可靠方法是 运行 一个 bat 文件以在构建时自动化 AzureStorageEmulator status/stop/start。

有没有办法配置 VS 2022 以启动 AzureStorageEmulator 而不是 Azurite? VS 2022 能否与 Azure Functions v1 正常工作?

So what does a VS-2022 configuration for Azure Function V1 look like? Is it a host.json config? Connected Services? What's the magic bullet?

运行 Visual Studio 2022 中的 Azure Functions v1 时,您可能会在很多地方遇到意外错误。

  • 在 v1 项目的 Azure Functions 中使用绑定扩展时,您需要从 NuGet 官方网站检查 NuGet 工具或 .NET Core CLI 命令是否已弃用或运行正在使用.

  • 如果是非 .NET 语言,则在从 V1 迁移到 v2 或更早版本时需要注意扩展包。 有关详细信息,请参阅 here

  • 我们在 function.json 文件中定义服务绑定,例如输入和输出绑定,或者有时它会根据函数 [=36= 上的绑定声明自动生成该文件中的绑定代码] 直接地。当 运行 在最新环境中运行时,我们也需要处理该文件,可能会有一些关键字发生变化。

  • 当您记录函数 运行s 时,可能会有 TraceWriter class 并且编译器告诉您使用 ILogger 或更新 Azure Functions Core Tools 版本时可能会发生一些重大更改。

我们的团队能够通过使用以下 *.csproj 更改更新 Azure v1.x 函数项目来解决此问题。该解决方案阻止 Azurite 启动,而是启动 AzureStorageEmulator。

/Resources/Automation/Batch 目录中新建 StartAzureStorageEmulator.bat 文件。

@echo off
cd "C:\Program Files (x86)\Microsoft SDKs\Azure\Storage Emulator\"

for /f "tokens=1-2" %%i IN ('"AzureStorageEmulator.exe status"') do (
    IF "%%i"=="IsRunning:" set value=%%j
)

if %value%==True "C:\Program Files (x86)\Microsoft SDKs\Azure\Storage Emulator\AzureStorageEmulator.exe" "stop"

"C:\Program Files (x86)\Microsoft SDKs\Azure\Storage Emulator\AzureStorageEmulator.exe" "start"
exit /b 0

StartDevelopmentStorage 添加到 属性 组。

  <PropertyGroup>
      <StartDevelopmentStorage>False</StartDevelopmentStorage>
  </PropertyGroup>

在最终 ItemGroup 节点之后的最后添加 PostBuild(引用新 StartAzureStorageEmulator.bat 文件)。

  <Target Name="PostBuild" AfterTargets="PostBuildEvent">
    <Exec Command="if $(ConfigurationName) == Debug call ..\..\Resources\Automation\Batch\StartAzureStorageEmulator.bat" />
  </Target>

作为一个额外的好处,此修复程序还 VS-2019/2022 兼容。