Search code examples
azureazure-functionsazure-blob-storageazure-function-appazure-functions-core-tools

Azure Function v3 unable to bind blob to CloudBlockBlob


Azure function v3 runtime on VS19 (.Net SDK) with azure-functions-core-tools@3 6.14.4.

I'm using a Time trigger and executing read/write on a blob. But the binding is failing. I've followed all instructions on the docs and tried other solutions from StackOverflow for Azure functions v2 but I'm unable to fix the binding. I've even created the bindings through the portal's integration feature and then used that function.json but the same error is popping up.

I need to solve 2 problems:

  1. Fixing the binding error as mentioned below.

  2. [From a different azure function] After publishing of application to Azure, function.json is being overwritten by the server resulting in loss of bindings so retention of bindings in function.json is also required (though it is claimed in the docs that it is managed by serve and editing is not recommended).

Info from the 1st problem:

Here's what the run function looks like:

public static async Task Run([TimerTrigger("0 */10 * * * *")]TimerInfo myTimer, ILogger log, 
[Blob("container/blob.json", FileAccess.ReadWrite, Connection = "AzureWebJobsStorage")] CloudBlockBlob stateStore)

Function.json :

{
  "bindings": [
    {
      "name": "myTimer",
      "direction": "in",
      "type": "timerTrigger",
      "schedule": "0 */10 * * * *"
    },
    {
      "name": "stateStore",
      "direction": "inout",
      "type": "blob",
      "path": "container/blob.json",
      "connection": "AzureWebJobsStorage"
    }
  ]
}

host.json

{
  "version": "2.0",
  "extensionBundle": {
    "id": "Microsoft.Azure.Functions.ExtensionBundle",
    "version": "[1.*, 2.0.0)"
  },
  "logging": {
    "applicationInsights": {
      "samplingExcludedTypes": "Request",
      "samplingSettings": {
        "isEnabled": true
      }
    }
  }
}

Csproj:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>
    <AzureFunctionsVersion>v3</AzureFunctionsVersion>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Azure.Storage.Blobs" Version="12.4.2" />
    <PackageReference Include="Azure.Storage.Files.Shares" Version="12.2.1" />
    <PackageReference Include="Azure.Storage.Queues" Version="12.3.0" />
    <PackageReference Include="Microsoft.ApplicationInsights" Version="2.14.0" />
    <PackageReference Include="Microsoft.Azure.Functions.Extensions" Version="1.0.0" />
    <PackageReference Include="Microsoft.Azure.KeyVault" Version="3.0.5" />
    <PackageReference Include="Microsoft.Azure.Services.AppAuthentication" Version="1.4.0" />
    <PackageReference Include="Microsoft.Azure.WebJobs.Extensions.ServiceBus" Version="4.1.1" />
    <PackageReference Include="Microsoft.Azure.WebJobs.Extensions.Storage" Version="3.0.11" />
    <PackageReference Include="Microsoft.Azure.WebJobs.Script.ExtensionsMetadataGenerator" Version="1.1.8" />
    <PackageReference Include="Microsoft.Extensions.Azure" Version="1.0.0" />
    <PackageReference Include="Microsoft.Extensions.Configuration.UserSecrets" Version="3.1.4" />
    <PackageReference Include="Microsoft.NET.Sdk.Functions" Version="3.0.7" />
    <PackageReference Include="Microsoft.TeamFoundationServer.Client" Version="16.153.0" />
    <PackageReference Include="WindowsAzure.Storage" Version="9.3.3" />
  </ItemGroup>
  <ItemGroup>
    <None Update="host.json">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </None>
    <None Update="local.settings.json">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      <CopyToPublishDirectory>Never</CopyToPublishDirectory>
    </None>
  </ItemGroup>
  <ItemGroup>
    <WCFMetadata Include="Connected Services" />
  </ItemGroup>
</Project>

Error on executing:

 1 functions loaded
[14-05-2020 10:17:11] Generating 1 job function(s)
[14-05-2020 10:17:11] Microsoft.Azure.WebJobs.Host: Error indexing method 'FunctionAppName'. 
Microsoft.Azure.WebJobs.Host: Cannot bind parameter 'stateStore' to type CloudBlockBlob. 
Make sure the parameter Type is supported by the binding. 
If you're using binding extensions (e.g. Azure Storage, ServiceBus, Timers, etc.) 
make sure you've called the registration method for the extension(s) in your startup code (e.g. builder.AddAzureStorage(), builder.AddServiceBus(), builder.AddTimers(), etc.).

Solution

  • Seems to me it's a problem mixing the multiple storage sdk availables with the latest runtime available.

    WindowsAzure.Storage is legacy Azure.Storage.Blobs seems to be wrong too. Try removing them and also add Microsoft.Azure.Storage.Blob nuget package.