标签: grpc-dotnet

.Net 5:在 Windows Server 2019 的 IIS 10 中托管 ASP.NET Core gRPC 服务

根据Microsoft Doc 中的这篇文章和此警告部分:

ASP.NET Core gRPC 对于与 Azure 应用服务或 IIS 一起使用有额外的要求。有关可以在何处使用 gRPC 的更多信息,请参阅 .NET 支持的平台上的 gRPC。

我使用上面的文档指南在包中创建了一个ASP.Net Core gRPC服务。.NET 5Grpc.AspNetCore(2.34.0)

对于本文档,我在 IIS 中托管了我的服务

我的问题RPC:我在客户端的调用方法中收到错误。

给定错误:

Status(StatusCode="Cancelled", Detail="No grpc-status found on response.")
Run Code Online (Sandbox Code Playgroud)

附加:我在网上搜索并调查了很多问题,但这些问题对我没有帮助。尽管如此,我还是有这个错误。我想对这个动作有一个误解或遗漏的问题。

我的主要问题:此时实际上可以在 IIS 中托管 ASP.NET Core Grpc 服务。

OS: Windows Server 2019 版本 1809 内部版本 17763.1697

IIS:版本10.0.17763.1

客户端代码:

    using var channel = GrpcChannel.ForAddress("https://192.168.13.155");
    var client = new ProccessMessage.ProccessMessageClient(channel);
    try
    {
        var result = client.GetMessage(new Request { Name …
Run Code Online (Sandbox Code Playgroud)

grpc iis-10 asp.net-core .net-5 grpc-dotnet

8
推荐指数
1
解决办法
7317
查看次数

如何在 ASP.NET Core 中为 gRPC 服务添加全局异常处理程序?

我正在使用 GRPC.ASPNETCore 使用 ASP.NET Core 编写 gRPC 服务。

我试图为这样的 gRPC 方法添加一个异常过滤器

services.AddMvc(options =>
{
    options.Filters.Add(typeof(BaseExceptionFilter));
});
Run Code Online (Sandbox Code Playgroud)

或使用这样的UseExceptionHandler扩展方法

app.UseExceptionHandler(configure =>
{
    configure.Run(async e =>
    {
        Console.WriteLine("Exception test code");
    });
});
Run Code Online (Sandbox Code Playgroud)

但是它们都不起作用(不拦截代码)。

是否可以在 ASP.NET Core 中为 gRPC 服务添加全局异常处理程序?

我不想为try-catch我想调用的每个方法编写代码包装器。

c# .net-core grpc asp.net-core grpc-dotnet

6
推荐指数
1
解决办法
4123
查看次数

为 gRPC 客户端创建接口以进行单元测试

我有一个带有生成的 gRPC 客户端的 dotnet core 3 控制台应用程序项目(使用下面 csproj 中的 Protobuf 元素)。我想对我的代码进行单元测试。有没有办法生成我的 gRPC 客户端以包含生成的类的接口,以便我可以正确模拟 gRPC 客户端?

感谢您的时间!

<ItemGroup>
    <Protobuf Include="..\..\Data\Protos\*" GrpcServices="Client" />
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)

c# unit-testing .net-core grpc grpc-dotnet

5
推荐指数
1
解决办法
2839
查看次数

将基于 Java 的 Grpc 服务器与基于 C# 的客户端一起使用时出现传输失败错误

我正在使用 spring boot (2.2.2) 和 grpc-server-spring-boot-starter java 库开发一个基于 java 的 Grpc 服务器。我的客户端应用程序是 C# 应用程序 (netcoreapp3.1)。这两个应用程序都在我的笔记本电脑上运行以进行此测试。

这是我的原型文件

syntax = "proto3";

option java_multiple_files = true;
option java_package = "com.honeywell.EOM.SystemAPI.webapi.web.grpc.service";
//option java_outer_classname = "TestProto";

service Simple {
    rpc GetData (Empty) returns (Data) {
    }
}

message Empty {

}

message Data {
    string name = 1;
}
Run Code Online (Sandbox Code Playgroud)

这是服务代码

@GrpcService
public class TestService extends SimpleGrpc.SimpleImplBase {
    @Override
    public void getData(Empty request, StreamObserver<Data> responseObserver) {
        Data data = Data.newBuilder().setName("Somename").build();
        responseObserver.onNext(data);
        responseObserver.onCompleted();
    }
}
Run Code Online (Sandbox Code Playgroud)

我首先使用这个工具工具测试了服务器 …

protocol-buffers proto grpc grpc-java grpc-dotnet

5
推荐指数
1
解决办法
5314
查看次数

在 .NET 依赖注入中,gRPC 通道应该是单例通道、作用域通道还是瞬态通道?

.NET 中的 gRPC 请求依赖于通道,必须关闭并处置该通道:

using var channel = Grpc.Net.Client.GrpcChannel.ForAddress("path to service");

//...do stuff...

await channel.ShutdownAsync();
Run Code Online (Sandbox Code Playgroud)

我正在使用 .NET 依赖注入服务将其包装起来IServiceCollection,这应该是......

  • 每个方法 - 在每个方法调用内创建和处置通道。
  • AddTransient- 每次请求我的服务时都会有一个新频道,但仅限于需要时。
  • AddScoped- 每个请求都有一个新通道,但保持通道打开直到请求完成。
  • AddSingleton- 该应用程序的一个新频道。

认为 AddSingleton已经过时了,因为我不确定如何GrpcChannel同时处理大量并行请求,并且我想传递CancellationToken当前请求。

AddScoped这就需要在VSAddTransient与每种方法之间进行选择。如果没有大量的测试(并陷入所有陷阱),我不确定这里的最佳实践是什么(我是 gRPC 的新手)。我应该尽快关闭该通道,还是保持其打开并在通话之间共享?

dependency-injection grpc .net-5 grpc-dotnet asp.net-core-3.1

5
推荐指数
1
解决办法
4448
查看次数

读取 grpc 的 dot net core 中间件中的请求正文

我有一个单一服务,它使用 dot net core 3.1 托管 API 控制器和 GRPC。\n我有需要同时适用于两者(API 和 GRPC)的中间件,并且我需要读取其中的请求正文。\n我尝试过下面的方法,它适用于 API 请求,但不适用于 grpc。当我读取流时,我在其中获取 grpc 请求负载的 unicode 字符,例如“\\0\\0\\0\\0\xef\xbf\xbd\\n\xef\xbf\xbd\\u0001”。

\n
httpContext.Request.EnableBuffering();\nvar reqVal = await new StreamReader(httpContext.Request.Body).ReadToEndAsync();\nhttpContext.Request.Body.Position = 0;\n
Run Code Online (Sandbox Code Playgroud)\n

.net-core grpc-dotnet

5
推荐指数
0
解决办法
877
查看次数

gRPC 文件上传总是返回 The request Stream was aborted

我正在尝试将文件从客户端分块上传到服务器。自从我尝试自己编写一个块上传器以来已经有十年了,这比我记忆中的要难。

上传.proto

syntax = "proto3";

option csharp_namespace = "GrpcService1";

package upload;

// The FileDownload service definition.
service Uploader {
  // Download a file
  rpc UploadFileStream(stream UploadFileRequest) returns (UploadFileResponse) {}
}

// The request message containing file data, and file name
message UploadFileRequest {
  bytes data = 1;
  string fileName = 2;
}

// The response from the upload containing the filePath
message UploadFileResponse {
  string filePath =1;
}
Run Code Online (Sandbox Code Playgroud)

上传服务

using Grpc.Core;

namespace GrpcService1.Services;

public class UploaderService : Uploader.UploaderBase
{
    private …
Run Code Online (Sandbox Code Playgroud)

c# grpc grpc-dotnet

5
推荐指数
1
解决办法
2211
查看次数

通过aspnet core中的代码触发HealthCheck

我正在使用微服务(多个服务),并且希望拥有 HealthCheck 服务,我可以调用该服务并获取所有正在运行的服务的运行状况。我不想触发每项服务的运行状况检查。这个想法是通过 GRPC 获取每个服务的健康状况。

我的一项服务有:

''' services.AddHealthChecks() .AddCheck("Ping", () => HealthCheckResult.Healthy("Ping 正常!"), Tags: new[] { "ping_tag" }).AddDbContextCheck(name: "我的数据库”);'''

当在此服务中调用我的 GRPC 端点并获取结果时,如何通过代码运行运行状况检查。

asp.net-core grpc-dotnet health-check

4
推荐指数
1
解决办法
1891
查看次数

使用 MSBuild 构建 gRPC dotnet 核心项目时如何包含自定义目录

我有一个 dotnet core gRPC 项目,我正在尝试在我的 proto 文件中包含路由注释,如下所示:

import "google/api/annotations.proto";
Run Code Online (Sandbox Code Playgroud)

文件结构是这样的(因为我将googleapis存储库作为 git 子模块导入):

protos/
    myproto.proto

    googleapis/
        google/
           api/
               annotations.proto
               ...
Run Code Online (Sandbox Code Playgroud)

在 go 项目中,它可以通过以下方式完成:

protoc -I . -I ./googleapis --go_out=plugins=grpc:. *.proto
Run Code Online (Sandbox Code Playgroud)

where-I ./googleapis为编译器提供了可以找到annotations.proto文件及其依赖项的目录。

但是,当我使用如下配置在 dotnet grpc 项目中使用 MSBuild 时,我无法弄清楚如何包含自定义目录。

<ItemGroup>
    <Protobuf Include="protos/*.proto" GrpcServices="Server" />
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)

官方文档提到了自定义目标构建的替代方法,以便我可以使用protoc

protoc --plugin=protoc-gen-grpc=$(gRPC_PluginFullPath)  -I $(Protobuf_StandardImportsPath) ...
Run Code Online (Sandbox Code Playgroud)

但是上面的命令会忽略服务定义并且不会像这里提到的那样生成服务器存根代码,而 MSBuild 会。

我发现但不理想的解决方法:

我意识到Grpc.Toolsdotnet 包分发了一些常用的 proto 文件,所以我annotations.proto在那里(在 macOS 中)复制了它的依赖项并且它工作了:

`~\.nuget\packages\grpc.tools\2.25.0\build\native\include`
Run Code Online (Sandbox Code Playgroud)

更新:

另一种解决方法:

默认情况下包含项目根目录,因此将其用作基本路径并将导入的 proto 文件复制到那里也可以工作(更好但仍然不理想)。 …

msbuild protocol-buffers .net-core grpc grpc-dotnet

2
推荐指数
1
解决办法
1588
查看次数

使用 ASP.NET Core 同时运行 REST API 和 gRPC

我正在尝试在特定端口(如 5000)上使用 ASP.NET Core 6 并行 REST API 运行 gRPC 服务器和客户端。我的意思是,我想使用 localhost:5000,但在检查了 的dotnetgRPC 模板之后,我发现Http2应该为 Kestrel 端点设置协议,appsettings.json如下所示:

{
  "urls": "http://localhost:5000",
  "Kestrel": {
    "EndpointDefaults": {
      "Protocols": "Http2"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

通过这样做,我遇到了一个问题,我的 REST API 不再工作,我猜这是因为Http2提供给 Kestrel 端点的协议,因为当我删除提供的协议 API 时,它可以正常工作;相反,gRPC 客户端无法工作。有什么办法可以并行运行两个端点吗?

asp.net appsettings asp.net-web-api grpc grpc-dotnet

2
推荐指数
1
解决办法
1859
查看次数