Číst v angličtině

Sdílet prostřednictvím


Služby a klienti gRPC v kódu s .NET

Poznámka

Toto není nejnovější verze tohoto článku. Aktuální verzi najdete v tomto článku ve verzi .NET 9.

Upozornění

Tato verze ASP.NET Core se už nepodporuje. Další informace najdete v zásadách podpory .NET a .NET Core. Aktuální verzi najdete v tomto článku ve verzi .NET 9.

Důležité

Tyto informace se týkají předběžného vydání produktu, který může být podstatně změněn před komerčním vydáním. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.

Aktuální verzi najdete v tomto článku ve verzi .NET 9.

James Newton-King a Marc Gravell

GRPC v kódu používá k definování kontraktů služeb a zpráv typy .NET.

První kód je dobrou volbou, když celý systém používá .NET:

  • Služby .NET a datové typy kontraktů lze sdílet mezi serverem .NET a klienty.
  • Vyhněte se nutnosti definovat kontrakty v .proto souborech a generování kódu.

V polyglotových systémech s více jazyky se nedoporučuje kód. U platforem non-.NET nejde použít typy služeb a datových kontraktů .NET. Aby bylo potřeba volat službu gRPC napsanou pomocí kódu, musí jiné platformy vytvořit .proto kontrakt, který odpovídá službě.

protobuf-net. Grpc

Důležité

Nápovědu k protobuf-net. Grpc, navštivte protobuf-net. Web Grpc nebo vytvořte problém na protobuf-net. Úložiště GitHub Grpc

protobuf-net. Grpc je komunitní projekt a Microsoft ho nepodporuje. Přidá podporu prvního kódu do Grpc.AspNetCore a Grpc.Net.Client. Používá typy .NET anotované s atributy k definování služeb a zpráv gRPC aplikace.

Prvním krokem k vytvoření služby gRPC prvního kódu je definování kontraktu kódu:

C#
using ProtoBuf.Grpc;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Threading.Tasks;

namespace Shared.Contracts;

[DataContract]
public class HelloReply
{
    [DataMember(Order = 1)]
    public string Message { get; set; }
}

[DataContract]
public class HelloRequest
{
    [DataMember(Order = 1)]
    public string Name { get; set; }
}

[ServiceContract]
public interface IGreeterService
{
    [OperationContract]
    Task<HelloReply> SayHelloAsync(HelloRequest request,
        CallContext context = default);
}

Předchozí kód:

  • HelloRequest Definuje a HelloReply zprávy.
  • Definuje rozhraní kontraktu IGreeterService s unární SayHelloAsync metodou gRPC.

Kontrakt služby se implementuje na serveru a volá se z klienta.

Metody definované v rozhraních služby musí odpovídat určitým podpisům v závislosti na tom, jestli jsou:

  • Unární
  • Streamování serveru
  • Streamování klienta
  • Obousměrné streamování

Další informace o definování kontraktů služeb naleznete v protobuf-net. Úvodní dokumentace k nástroji Grpc

Vytvoření služby gRPC první kód

Přidání služby gRPC code-first do aplikace ASP.NET Core:

  • Přidejte protobuf-net. Referenční informace k balíčku Grpc.AspNetCore

  • Přidejte odkaz na projekt sdíleného kontraktu kódu.

    XML
    <Project Sdk="Microsoft.NET.Sdk.Web">
    
      <PropertyGroup>
        <TargetFramework>net6.0</TargetFramework>
        <Nullable>enable</Nullable>
        <ImplicitUsings>enable</ImplicitUsings>
      </PropertyGroup>
    
      <ItemGroup>
        <PackageReference Include="protobuf-net.Grpc.AspNetCore" Version="1.0.152" />
      </ItemGroup>
    
      <ItemGroup>
          <ProjectReference Include="..\Shared\Shared.Contracts.csproj" />
      </ItemGroup>
    
    </Project>
    
  • Vytvořte nový GreeterService.cs soubor a implementujte IGreeterService rozhraní služby:

    C#
    using Shared.Contracts;
    using ProtoBuf.Grpc;
    
    public class GreeterService : IGreeterService
    {
        public Task<HelloReply> SayHelloAsync(HelloRequest request, CallContext context = default)
        {
            return Task.FromResult(
                    new HelloReply
                    {
                        Message = $"Hello {request.Name}"
                    });
        }
    }
    
  • Aktualizujte Program.cs soubor:

    C#
    using ProtoBuf.Grpc.Server;
    
    var builder = WebApplication.CreateBuilder(args);
    
    // Additional configuration is required to successfully run gRPC on macOS.
    // For instructions on how to configure Kestrel and gRPC clients on macOS, visit https://go.microsoft.com/fwlink/?linkid=2099682
    
    // Add services to the container.
    builder.Services.AddCodeFirstGrpc();
    
    var app = builder.Build();
    
    // Configure the HTTP request pipeline.
    app.MapGrpcService<GreeterService>();
    app.MapGet("/", () => "Communication with gRPC endpoints must be made through a gRPC client. To learn how to create a client, visit: https://go.microsoft.com/fwlink/?linkid=2086909");
    
    app.Run();
    

    Předchozí zvýrazněný kód aktualizuje následující:

    • AddCodeFirstGrpc registruje služby, které povolují kód jako první.
    • MapGrpcService<GreeterService> přidá koncový bod služby první kód.

Služby gRPC implementované s kódem a .proto soubory můžou existovat společně ve stejné aplikaci. Všechny služby gRPC používají konfiguraci služby gRPC.

Vytvoření klienta gRPC prvního kódu

Klient gRPC s kódem používá kontrakt služby k volání služeb gRPC.

  • V klientském .csproj souboru gRPC:

    XML
    <Project Sdk="Microsoft.NET.Sdk">
    
      <PropertyGroup>
        <OutputType>Exe</OutputType>
        <TargetFramework>net6.0</TargetFramework>
        <ImplicitUsings>enable</ImplicitUsings>
        <Nullable>enable</Nullable>
      </PropertyGroup>
    
      <ItemGroup>
        <PackageReference Include="Grpc.Net.Client" Version="2.52.0" />
        <PackageReference Include="protobuf-net.Grpc" Version="1.0.152" />
      </ItemGroup>
        
      <ItemGroup>
        <ProjectReference Include="..\Shared\Shared.Contracts.csproj" />
      </ItemGroup>
    
    </Project>
    
  • Aktualizace klienta program.cs

    C#
    // See https://aka.ms/new-console-template for more information
    using Grpc.Net.Client;
    using ProtoBuf.Grpc.Client;
    using Shared.Contracts;
    
    namespace GrpcGreeterClient;
    
    internal class Program
    {
        private static async Task Main(string[] args)
        {
            using var channel = GrpcChannel.ForAddress("https://localhost:7184");
            var client = channel.CreateGrpcService<IGreeterService>();
    
            var reply = await client.SayHelloAsync(
                new HelloRequest { Name = "GreeterClient" });
    
            Console.WriteLine($"Greeting: {reply.Message}");
            Console.WriteLine("Press any key to exit...");
            Console.ReadKey();
        }
    }
    
    
    

Předchozí kód klienta Program.cs gRPC:

  • Vytvoří kanál gRPC.
  • Vytvoří klienta prvního kódu z kanálu pomocí CreateGrpcService<IGreeterService> metody rozšíření.
  • Volá službu gRPC s SayHelloAsync.

Z kanálu se vytvoří klient gRPC prvního kódu. Stejně jako běžný klient používá klient první kód konfiguraci kanálu.

Zobrazení nebo stažení ukázkového kódu (postup stažení)

Další materiály

GRPC v kódu používá k definování kontraktů služeb a zpráv typy .NET.

První kód je dobrou volbou, když celý systém používá .NET:

  • Služby .NET a datové typy kontraktů lze sdílet mezi serverem .NET a klienty.
  • Vyhněte se nutnosti definovat kontrakty v .proto souborech a generování kódu.

V polyglotových systémech s více jazyky se nedoporučuje kód. U platforem non-.NET nejde použít typy služeb a datových kontraktů .NET. Aby bylo potřeba volat službu gRPC napsanou pomocí kódu, musí jiné platformy vytvořit .proto kontrakt, který odpovídá službě.

protobuf-net. Grpc

Důležité

Nápovědu k protobuf-net. Grpc, navštivte protobuf-net. Web Grpc nebo vytvořte problém na protobuf-net. Úložiště GitHub Grpc

protobuf-net. Grpc je komunitní projekt a Microsoft ho nepodporuje. Přidá podporu prvního kódu do Grpc.AspNetCore a Grpc.Net.Client. Používá typy .NET anotované s atributy k definování služeb a zpráv gRPC aplikace.

Prvním krokem k vytvoření služby gRPC prvního kódu je definování kontraktu kódu:

C#
[DataContract]
public class HelloReply
{
    [DataMember(Order = 1)]
    public string Message { get; set; }
}

[DataContract]
public class HelloRequest
{
    [DataMember(Order = 1)]
    public string Name { get; set; }
}

[ServiceContract]
public interface IGreeterService
{
    [OperationContract]
    Task<HelloReply> SayHelloAsync(HelloRequest request,
        CallContext context = default);
}

Předchozí kód:

  • HelloRequest Definuje a HelloReply zprávy.
  • Definuje rozhraní kontraktu IGreeterService s unární SayHelloAsync metodou gRPC.

Kontrakt služby se implementuje na serveru a volá se z klienta. Metody definované v rozhraních služby se musí shodovat s určitými podpisy v závislosti na tom, jestli se jedná o unární, serverové streamování, streamování klientů nebo obousměrné streamování.

Další informace o definování kontraktů služeb naleznete v protobuf-net. Úvodní dokumentace k nástroji Grpc

Vytvoření služby gRPC první kód

Přidání služby gRPC code-first do aplikace ASP.NET Core:

Vytvořte nový GreeterService.cs soubor a implementujte IGreeterService rozhraní služby:

C#
public class GreeterService : IGreeterService
{
    public Task<HelloReply> SayHelloAsync(HelloRequest request, CallContext context = default)
    {
        return Task.FromResult(
               new HelloReply
               {
                   Message = $"Hello {request.Name}"
               });
    }
}

Aktualizujte Startup.cs soubor:

C#
public void ConfigureServices(IServiceCollection services)
{
    services.AddCodeFirstGrpc();
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

    app.UseRouting();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapGrpcService<GreeterService>();
    });
}

V předchozím kódu:

  • AddCodeFirstGrpc registruje služby, které povolují kód jako první.
  • MapGrpcService<GreeterService> přidá koncový bod služby první kód.

Služby gRPC implementované s kódem a .proto soubory můžou existovat společně ve stejné aplikaci. Všechny služby gRPC používají konfiguraci služby gRPC.

Vytvoření klienta gRPC prvního kódu

Klient gRPC s kódem používá kontrakt služby k volání služeb gRPC. Volání služby gRPC pomocí klienta prvního kódu:

C#
using var channel = GrpcChannel.ForAddress("https://localhost:5001");
var client = channel.CreateGrpcService<IGreeterService>();

var reply = await client.SayHelloAsync(
    new HelloRequest { Name = "GreeterClient" });

Console.WriteLine($"Greeting: {reply.Message}");

Předchozí kód:

  • Vytvoří kanál gRPC.
  • Vytvoří klienta prvního kódu z kanálu pomocí CreateGrpcService<IGreeterService> metody rozšíření.
  • Volá službu gRPC s SayHelloAsync.

Z kanálu se vytvoří klient gRPC prvního kódu. Stejně jako běžný klient používá klient první kód konfiguraci kanálu.

Zobrazení nebo stažení ukázkového kódu (postup stažení)

Další materiály