Context
I'm trying to use Google's Cloud Natural Language API. I have my service account key JSON file, and am trying to write a simple .NET Core application (more specifically an Azure Function using .NET Core) that will take in some text and use the sentiment analysis function from the Natural Language API and return a couple values.
I'm basing my implementation off Google's documentation, specifically the code section under the heading:
Passing the path to the service account key in code
The following is my application:
using System;
using System.IO;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using Google.Cloud.Language.V1;
using Google.Apis.Auth.OAuth2;
using Grpc.Auth;
namespace Project.Function
{
public static class GoogleNLAPI
{
[FunctionName("GoogleNLAPI")]
public static async Task<IActionResult> Run(
[HttpTrigger(AuthorizationLevel.Admin, "get", "post", Route = null)] HttpRequest req,
ILogger log,
ExecutionContext context)
{
string content = req.Query["content"];
var path = Path.Combine(context.FunctionAppDirectory, "{FILE-NAME}");
var credential = GoogleCredential.FromFile(path)
.CreateScoped(LanguageServiceClient.DefaultScopes);
var channel = new Grpc.Core.Channel(
LanguageServiceClient.DefaultEndpoint.ToString(),
credential.ToChannelCredentials()
);
var languageClient = LanguageServiceClient.Create(channel);
var response = languageClient.AnalyzeSentiment(new Document()
{
Content = content,
Type = Document.Types.Type.PlainText
});
var sentiment = response.DocumentSentiment;
return new OkObjectResult($"Score: {sentiment.Score}\nMagnitude: {sentiment.Magnitude}");
}
}
}
And the .csproj file:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netcoreapp2.1</TargetFramework>
<AzureFunctionsVersion>v2</AzureFunctionsVersion>
<RootNamespace>google_nl_api</RootNamespace>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.NET.Sdk.Functions" Version="1.0.28"/>
<PackageReference Include="Google.Cloud.Language.V1" Version="1.2.0"/>
<PackageReference Include="Google.Apis.Auth" Version="1.40.2"/>
<PackageReference Include="Grpc.Auth" Version="1.21.0"/>
</ItemGroup>
<ItemGroup>
<None Update="host.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="{FILE-NAME}">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="local.settings.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
<CopyToPublishDirectory>Never</CopyToPublishDirectory>
</None>
</ItemGroup>
</Project>
Issue
When I run this, I get the following error:
Exception while executing function: GoogleNLAPI. Grpc.Auth: Could not load type 'Grpc.Core.CallCredentials' from assembly 'Grpc.Core.Api, Version=1.0.0.0, Culture=neutral, PublicKeyToken=d754f35622e28bad'.
I'm using Grpc.Auth because without it I am unable to use .ToChannelCredentials(), which seems to be the method where the error is occurring.