Grpc.Auth:无法从程序集“Grpc.Core.Api"加载类型“Grpc.Core.CallCredentials" [英] Grpc.Auth: Could not load type 'Grpc.Core.CallCredentials' from assembly 'Grpc.Core.Api'

查看:24
本文介绍了Grpc.Auth:无法从程序集“Grpc.Core.Api"加载类型“Grpc.Core.CallCredentials"的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用 Google 的 Cloud Natural Language API.我有我的服务帐户密钥 JSON 文件,并且正在尝试编写一个简单的 .NET Core 应用程序(更具体地说是使用 .NET Core 的 Azure 函数),它将接收一些文本并使用来自自然语言 API 的情绪分析函数并返回几个值.

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.

我的实现基于 Google 的文档,特别是标题下的代码部分:

I'm basing my implementation off Google's documentation, specifically the code section under the heading:

在代码中传递服务帐户密钥的路径

以下是我的申请:

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}
Magnitude: {sentiment.Magnitude}");
        }
    }
}

和 .csproj 文件:

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'.

我正在使用 Grpc.Auth,因为没有它我无法使用 .ToChannelCredentials(),这似乎是发生错误的方法.

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.

推荐答案

更具体地说是使用 .NET Core 的 Azure 函数

more specifically an Azure Function using .NET Core

不幸的是,这就是问题所在.

That's the problem, unfortunately.

至少在模拟器中,存在一个问题,即模拟器包含比 1.21.0 旧版本的 Grpc.Core.通常只有在使用新功能时才会出现问题,但在 1.19.0 (IIRC) 左右,Grpc.Core 被拆分为 Grpc.Core 和 Grpc.Core.Api,类型转发处理兼容性问题.这很好,直到您使用期望分割出现的代码,但发现旧版本的 Grpc.Core 已被加载.

At least in the emulator, there's a problem where the emulator contains an older version of Grpc.Core than 1.21.0. Normally that would only be a problem if new features were being used, but around 1.19.0 (IIRC), Grpc.Core was split into Grpc.Core and Grpc.Core.Api, with type forwarding handling the compatibility issue. That's fine until you use code that expects the split to be present, but finds that the old version of Grpc.Core has been loaded instead.

问题已报告给 Microsoft,但我没有还没有看到任何解决方法.请注意,您甚至不需要对 Google.Apis.AuthGrpc.Auth 的任何直接引用 - 请参阅我在该问题的最终评论中发布的重现.

This issue has been reported to Microsoft but I haven't seen any workarounds yet. Note that you don't even need any direct reference to Google.Apis.Auth or Grpc.Auth - see the repro I posted in the final comment on that issue.

这篇关于Grpc.Auth:无法从程序集“Grpc.Core.Api"加载类型“Grpc.Core.CallCredentials"的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆