gRPC für C# (.NET): Bibliotheken und Anwendungsbeispiele

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

gRPC für C# (.NET): Bibliotheken und Beispiele

\n\n

gRPC ist ein leistungsstarkes Framework für Remote Procedure Calls (RPC) von Google, das auf HTTP/2 und Protocol Buffers (protobuf) basiert. Im .NET-Ökosystem hat sich gRPC zum De-facto-Standard für die Kommunikation zwischen Microservices entwickelt und bietet strenge Typisierung, bidirektionales Streaming und geringe Latenz. In diesem Artikel betrachten wir die wichtigsten Bibliotheken für die Arbeit mit gRPC in C# und geben praktische Beispiele für die Einrichtung von Server und Client.

\n\n

Wichtige gRPC-Bibliotheken für .NET

\n\n

Für die Arbeit mit gRPC in .NET werden die folgenden NuGet-Pakete verwendet:

\n\n
    \n
  • Grpc.AspNetCore — Integration des gRPC-Servers in ASP.NET Core (empfohlen für das Hosting).
  • \n
  • Grpc.Net.Client — Client-Bibliothek für .NET (einschließlich .NET Core, .NET 5+).
  • \n
  • Grpc.Tools — Code-Generator aus .proto-Dateien (wird als Protobuf-Element in .csproj hinzugefügt).
  • \n
  • Google.Protobuf — Arbeit mit protobuf-Nachrichten.
  • \n
\n\n

Alle diese Pakete werden von Microsoft unterstützt und aktiv weiterentwickelt. Die Installation erfolgt über den NuGet Package Manager oder die dotnet CLI:

\n\n
dotnet add package Grpc.AspNetCore\ndotnet add package Grpc.Net.Client\ndotnet add package Google.Protobuf\ndotnet add package Grpc.Tools
\n\n

Erstellen eines gRPC-Servers in C#

\n\n

Betrachten wir die schrittweise Erstellung eines einfachen Dienstes für die Arbeit mit Bestellungen.

\n\n

1. Definition der Proto-Datei

\n

Erstellen Sie eine Datei order.proto im Serverprojekt (z. B. GrpcServer):

\n\n
syntax = "proto3";\n\nservice OrderService {\n    rpc GetOrder (OrderRequest) returns (OrderResponse);\n    rpc SubscribeOrders (OrderRequest) returns (stream OrderResponse);\n}\n\nmessage OrderRequest {\n    int32 order_id = 1;\n}\n\nmessage OrderResponse {\n    int32 order_id = 1;\n    string status = 2;\n    double total = 3;\n}
\n\n

2. Konfiguration der .csproj für die Codegenerierung

\n

Fügen Sie in die .csproj-Datei ein:

\n\n
<ItemGroup>\n    <Protobuf Include="order.proto" GrpcServices="Server" />\n</ItemGroup>
\n\n

3. Implementierung des Dienstes

\n

Erstellen Sie eine Klasse, die von der generierten Basisklasse erbt:

\n\n
public class OrderServiceImpl : OrderService.OrderServiceBase\n{\n    public override Task<OrderResponse> GetOrder(OrderRequest request, ServerCallContext context)\n    {\n        return Task.FromResult(new OrderResponse\n        {\n            OrderId = request.OrderId,\n            Status = "Shipped",\n            Total = 99.99\n        });\n    }\n\n    public override async Task SubscribeOrders(OrderRequest request, \n        IServerStreamWriter<OrderResponse> responseStream, ServerCallContext context)\n    {\n        for (int i = 0; i < 5; i++)\n        {\n            await responseStream.WriteAsync(new OrderResponse\n            {\n                OrderId = request.OrderId,\n                Status = $"Update #{i}",\n                Total = 100 + i * 10\n            });\n            await Task.Delay(1000);\n        }\n    }\n}
\n\n

4. Registrierung in Program.cs

\n\n
var builder = WebApplication.CreateBuilder(args);\nbuilder.Services.AddGrpc();\n\nvar app = builder.Build();\napp.MapGrpcService<OrderServiceImpl>();\napp.MapGet("/", () => "gRPC server is running");\napp.Run();
\n\n

Erstellen eines gRPC-Clients in C#

\n\n

Jetzt erstellen wir eine Konsolenanwendung als Client (GrpcClient).

\n\n

1. Vorbereitung

\n

Kopieren Sie order.proto in das Client-Projekt und geben Sie in .csproj an:

\n\n
<Protobuf Include="order.proto" GrpcServices="Client" />
\n\n

2. Client-Code

\n\n
using Grpc.Net.Client;\nusing GrpcClient;\n\nvar channel = GrpcChannel.ForAddress("https://localhost:5001");\                    

Empfehlungen