Sdílet prostřednictvím


Služby gRPC s ASP.NET Core

Poznámka:

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

Varování

Tato verze ASP.NET Core se už nepodporuje. Další informace najdete v zásadách podpory .NET a .NET Core. Aktuální vydání naleznete v článku o 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í vydání najdete v verzi .NET 9 tohoto článku.

Tento dokument ukazuje, jak začít se službami gRPC pomocí ASP.NET Core.

Požadavky

Úvod do služby gRPC v ASP.NET Core

Zobrazení nebo stažení vzorového kódu (postup stažení)

Podrobné pokyny k vytvoření projektu gRPC najdete v tématu Začínáme se službami gRPC.

Přidání služeb gRPC do aplikace ASP.NET Core

Pro gRPC se vyžaduje balíček Grpc.AspNetCore.

Konfigurujte gRPC

V Program.cs:

  • gRPC je povoleno pomocí metody AddGrpc.
  • Každá služba gRPC se přidá do kanálu směrování prostřednictvím MapGrpcService metody.
using GrpcGreeter.Services;

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.AddGrpc();

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();

Pokud chcete zobrazit komentáře ke kódu přeložené do jiných jazyků, než je angličtina, dejte nám vědět v této diskuzi na GitHubu.

ASP.NET Core middleware a funkcionality sdílejí kanál směrování, takže aplikaci lze nakonfigurovat na obsluhu dalších zpracování požadavků. Další obslužné rutiny žádostí, jako jsou kontrolery MVC, fungují paralelně s nakonfigurovanými službami gRPC.

Možnosti serveru

Služby gRPC můžou hostovat všechny integrované servery ASP.NET Core.

  • Kestrel
  • TestServer
  • IIS†
  • HTTP.sys†

†Vyžaduje .NET 5 a Windows 11 Build 22000 nebo Windows Server 2022 Build 20348 nebo novější.

Další informace o výběru správného serveru pro aplikaci ASP.NET Core najdete v tématu Implementace webového serveru v ASP.NET Core.

Kestrel

Kestrel je multiplatformní webový server pro ASP.NET Core. Kestrel zaměřuje se na vysoké využití výkonu a paměti, ale nemá některé pokročilé funkce v HTTP.sys, jako je sdílení portů.

Kestrel Koncové body gRPC:

HTTP/2

gRPC vyžaduje HTTP/2. gRPC pro ASP.NET Core ověřuje , že httpRequest.Protocol je HTTP/2.

Kestrel podporuje PROTOKOL HTTP/2 ve většině moderních operačních systémů. Kestrel Koncové body jsou ve výchozím nastavení nakonfigurované tak, aby podporovaly připojení HTTP/1.1 a HTTP/2.

Protokol TLS

Kestrel koncové body používané pro gRPC by měly být zabezpečené pomocí protokolu TLS. Při vývoji se koncový bod zabezpečený protokolem TLS automaticky vytvoří https://localhost:5001 při přítomnosti vývojového certifikátu ASP.NET Core. Není nutná žádná konfigurace. Předpona https ověřuje, že Kestrel koncový bod používá protokol TLS.

V produkčním prostředí musí být protokol TLS explicitně nakonfigurovaný. V následujícím appsettings.json příkladu je k dispozici koncový bod HTTP/2 zabezpečený protokolem TLS:

{
  "Kestrel": {
    "Endpoints": {
      "HttpsInlineCertFile": {
        "Url": "https://localhost:5001",
        "Protocols": "Http2",
        "Certificate": {
          "Path": "<path to .pfx file>",
          "Password": "<certificate password>"
        }
      }
    }
  }
}

Alternativně je možné nakonfigurovat Kestrel koncové body v Program.cs:

var builder = WebApplication.CreateBuilder(args);

builder.WebHost.ConfigureKestrel(options =>
{
    options.Listen(IPAddress.Any, 5001, listenOptions =>
    {
        listenOptions.Protocols = HttpProtocols.Http2;
        listenOptions.UseHttps("<path to .pfx file>",
            "<certificate password>");
    });
});

Další informace o povolení protokolu TLS s Kestrel naleznete v části Kestrel Konfigurace koncového bodu HTTPS.

Vyjednávání protokolu

Protokol TLS se používá pro více než zabezpečení komunikace. Metoda handshake protokolu TLS Application-Layer Protocol (ALPN) se používá k vyjednávání protokolu připojení mezi klientem a serverem, když koncový bod podporuje více protokolů. Toto vyjednávání určuje, jestli připojení používá protokol HTTP/1.1 nebo HTTP/2.

Pokud je koncový bod HTTP/2 nakonfigurovaný bez protokolu TLS, musí být parametr ListenOptions.Protocols koncového bodu HttpProtocols.Http2 Koncový bod s několika protokoly, jako například HttpProtocols.Http1AndHttp2, nelze použít bez zabezpečení TLS, protože není možné žádné vyjednávání. Všechna připojení k nezabezpečeným koncovým bodům používají ve výchozím nastavení HTTP/1.1 a volání gRPC selžou.

Další informace o povolení protokolu HTTP/2 a TLS s Kestrel naleznete v tématu konfigurace koncového bodu Kestrel.

Poznámka:

macOS nepodporuje ASP.NET Core gRPC s protokolem TLS před .NET 8. K úspěšnému spuštění služeb gRPC v systému macOS při použití rozhraní .NET 7 nebo starších se vyžaduje další konfigurace. Další informace najdete v tématu Nejde spustit aplikaci ASP.NET Core gRPC v systému macOS.

IIS

Internetová informační služba (IIS) je flexibilní, zabezpečený a spravovatelný webový server pro hostování webových aplikací, včetně ASP.NET Core. K hostování služeb gRPC ve službě IIS se vyžadují .NET 5 a Windows 11 Build 22000 nebo Windows Server 2022 Build 20348 nebo novější.

Služba IIS musí být nakonfigurovaná tak, aby používala protokol TLS a HTTP/2. Další informace naleznete v tématu Použití ASP.NET Core s HTTP/2 ve službě IIS.

HTTP.sys

HTTP.sys je webový server pro ASP.NET Core, který běží jenom ve Windows. K hostování služeb gRPC s HTTP.sys se vyžadují .NET 5 a Windows 11 Build 22000 nebo Windows Server 2022 Build 20348 nebo novější.

HTTP.sys musí být nakonfigurované tak, aby používaly protokol TLS a HTTP/2. Další informace najdete v tématu HTTP.sys podpora HTTP/2 webového serveru.

Hostování gRPC v projektech non-ASP.NET Core

Server ASP.NET Core gRPC se obvykle vytváří ze šablony gRPC. Soubor projektu vytvořený šablonou se používá Microsoft.NET.SDK.Web jako sada SDK:

<Project Sdk="Microsoft.NET.Sdk.Web">

  <ItemGroup>
    <PackageReference Include="Grpc.AspNetCore" Version="2.47.0" />
    <Protobuf Include="Protos\greet.proto" GrpcServices="Server" />
  </ItemGroup>

</Project>

Microsoft.NET.SDK.Web Hodnota sady SDK automaticky přidá odkaz na architekturu ASP.NET Core. Odkaz umožňuje aplikaci používat typy ASP.NET Core vyžadované k hostování serveru.

Server gRPC můžete přidat do non-ASP.NET základních projektů s následujícím nastavením souboru projektu:

<Project Sdk="Microsoft.NET.Sdk">

  <ItemGroup>
    <PackageReference Include="Grpc.AspNetCore" Version="2.47.0" />
    <Protobuf Include="Protos\greet.proto" GrpcServices="Server" />
    
    <FrameworkReference Include="Microsoft.AspNetCore.App" />
  </ItemGroup>

</Project>

Předchozí soubor projektu:

  • Nepoužívá Microsoft.NET.SDK.Web jako SDK.
  • Přidá odkaz na framework do Microsoft.AspNetCore.App.
    • Referenční architektura umožňuje ne-ASP.NET Core aplikacím, jako jsou služby Windows, aplikace WPF nebo aplikace WinForms, používat rozhraní API ASP.NET Core.
    • Aplikace teď může ke spuštění serveru ASP.NET Core použít rozhraní API ASP.NET Core.
  • Přidá požadavky gRPC:

Další informace o použití referenční informace Microsoft.AspNetCore.App k rozhraní naleznete v tématu ASP.NET Core sdílené rozhraní.

Integrace s rozhraními API ASP.NET Core

Služby gRPC mají úplný přístup k funkcím ASP.NET Core, jako jsou injektáž závislostí (DI) a protokolování. Implementace služby může například přeložit službu protokolovacího nástroje z kontejneru DI.

Injektáž konstruktoru:

public class GreeterService : Greeter.GreeterBase
{
    private readonly ILogger<GreeterService> _logger;

    public GreeterService(ILogger<GreeterService> logger)
    {
        _logger = logger;
    }
}

Injektáž primárního konstruktoru (.NET 8 nebo novější):

public class GreeterService(ILogger<GreeterService> logger) : Greeter.GreeterBase
{
    ...
}

Ve výchozím nastavení může implementace služby gRPC vyřešit jiné služby DI s libovolnou životností (Singleton, Scoped nebo Transient).

Řešení HttpContext v metodách gRPC

Rozhraní gRPC API poskytuje přístup k některým datům zpráv HTTP/2, jako je metoda, hostitel, hlavička a trailery. Access je prostřednictvím argumentu ServerCallContext předaného každé metodě gRPC:

public class GreeterService : Greeter.GreeterBase
{
    public override Task<HelloReply> SayHello(
        HelloRequest request, ServerCallContext context)
    {
        return Task.FromResult(new HelloReply
        {
            Message = "Hello " + request.Name
        });
    }
}

ServerCallContext neposkytuje úplný přístup ke HttpContext všem rozhraním API ASP.NET. Metoda rozšíření GetHttpContext poskytuje plný přístup k reprezentaci základní zprávy HTTP/2 v ASP.NET API.

public class GreeterService : Greeter.GreeterBase
{
    public override Task<HelloReply> SayHello(
        HelloRequest request, ServerCallContext context)
    {
        var httpContext = context.GetHttpContext();
        var clientCertificate = httpContext.Connection.ClientCertificate;

        return Task.FromResult(new HelloReply
        {
            Message = "Hello " + request.Name + " from " + clientCertificate.Issuer
        });
    }
}

Další materiály

Tento dokument ukazuje, jak začít se službami gRPC pomocí ASP.NET Core.

Požadavky

Začínáme se službou gRPC v ASP.NET Core

Zobrazení nebo stažení vzorového kódu (postup stažení)

Podrobné pokyny k vytvoření projektu gRPC najdete v tématu Začínáme se službami gRPC.

Přidání služeb gRPC do aplikace ASP.NET Core

Pro gRPC se vyžaduje balíček Grpc.AspNetCore.

Konfigurace gRPC

V Program.cs:

  • gRPC je povolen pomocí metody AddGrpc.
  • Každá služba gRPC se přidá do kanálu směrování prostřednictvím MapGrpcService metody.
using GrpcGreeter.Services;

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.AddGrpc();

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();

Pokud chcete zobrazit komentáře ke kódu přeložené do jiných jazyků, než je angličtina, dejte nám vědět v této diskuzi na GitHubu.

ASP.NET Core middleware a funkce sdílejí směrovací kanál, proto lze aplikaci nakonfigurovat tak, aby obsluhovala další obslužné rutiny požadavků. Další obslužné rutiny žádostí, jako jsou kontrolery MVC, fungují paralelně s nakonfigurovanými službami gRPC.

Možnosti serveru

Služby gRPC můžou hostovat všechny integrované servery ASP.NET Core.

  • Kestrel
  • Testovací server
  • IIS†
  • HTTP.sys†

†Vyžaduje .NET 5 a Windows 11 sestavení 22000 nebo Windows Server 2022 sestavení 20348 nebo pozdější.

Další informace o výběru správného serveru pro aplikaci ASP.NET Core najdete v tématu Implementace webového serveru v ASP.NET Core.

Kestrel

Kestrel je multiplatformní webový server pro ASP.NET Core. Kestrel zaměřuje se na vysoké využití výkonu a paměti, ale nemá některé pokročilé funkce v HTTP.sys, jako je sdílení portů.

Kestrel Koncové body gRPC:

HTTP/2

gRPC vyžaduje HTTP/2. gRPC pro ASP.NET Core ověřuje, zda HttpRequest.Protocol je HTTP/2.

Kestrel podporuje PROTOKOL HTTP/2 ve většině moderních operačních systémů. Kestrel Koncové body jsou ve výchozím nastavení nakonfigurované tak, aby podporovaly připojení HTTP/1.1 a HTTP/2.

Protokol TLS

Kestrel koncové body používané pro gRPC by měly být zabezpečené pomocí protokolu TLS. Při vývoji se koncový bod zabezpečený protokolem TLS automaticky vytvoří https://localhost:5001 při přítomnosti vývojového certifikátu ASP.NET Core. Není nutná žádná konfigurace. Předpona https ověřuje, že Kestrel koncový bod používá protokol TLS.

V produkčním prostředí musí být protokol TLS explicitně nakonfigurovaný. V následujícím appsettings.json příkladu je k dispozici koncový bod HTTP/2 zabezpečený protokolem TLS:

{
  "Kestrel": {
    "Endpoints": {
      "HttpsInlineCertFile": {
        "Url": "https://localhost:5001",
        "Protocols": "Http2",
        "Certificate": {
          "Path": "<path to .pfx file>",
          "Password": "<certificate password>"
        }
      }
    }
  }
}

Alternativně Kestrel je možné nakonfigurovat koncové body v Program.cs:

var builder = WebApplication.CreateBuilder(args);

builder.WebHost.ConfigureKestrel(options =>
{
    options.Listen(IPAddress.Any, 5001, listenOptions =>
    {
        listenOptions.Protocols = HttpProtocols.Http2;
        listenOptions.UseHttps("<path to .pfx file>",
            "<certificate password>");
    });
});

Další informace o povolení protokolu TLS s využitím Kestrel najdete v části o Kestrel konfiguraci koncového bodu HTTPS.

Vyjednávání protokolu

Protokol TLS se používá pro více než zabezpečení komunikace. Metoda handshake protokolu TLS Application-Layer Protocol (ALPN) se používá k vyjednávání protokolu připojení mezi klientem a serverem, když koncový bod podporuje více protokolů. Toto vyjednávání určuje, jestli připojení používá protokol HTTP/1.1 nebo HTTP/2.

Pokud je koncový bod HTTP/2 nakonfigurovaný bez protokolu TLS, musí být parametr ListenOptions.Protocols koncového bodu HttpProtocols.Http2 Koncový bod s několika protokoly, jako například HttpProtocols.Http1AndHttp2, se nedá použít bez TLS, protože neexistuje žádné vyjednávání. Všechna připojení k nezabezpečeným koncovým bodům jsou ve výchozím nastavení nastavena na použití HTTP/1.1, a volání gRPC selžou.

Další informace o povolení protokolu HTTP/2 a TLS s Kestrel využitím najdete v tématu Kestrel konfigurace koncového bodu.

Poznámka:

macOS nepodporuje ASP.NET Core gRPC s protokolem TLS před .NET 8. K úspěšnému spuštění služeb gRPC v systému macOS při použití rozhraní .NET 7 nebo starších se vyžaduje další konfigurace. Další informace najdete v tématu Nejde spustit aplikaci ASP.NET Core gRPC v systému macOS.

IIS

Internetová informační služba (IIS) je flexibilní, zabezpečený a spravovatelný webový server pro hostování webových aplikací, včetně ASP.NET Core. K hostování služeb gRPC ve službě IIS se vyžadují .NET 5 a Windows 11 Build 22000 nebo Windows Server 2022 Build 20348 nebo novější.

Služba IIS musí být nakonfigurovaná tak, aby používala protokol TLS a HTTP/2. Další informace naleznete v tématu Použití ASP.NET Core s HTTP/2 ve službě IIS.

HTTP.sys

HTTP.sys je webový server pro ASP.NET Core, který běží jenom ve Windows. K hostování služeb gRPC s HTTP.sys se vyžadují .NET 5 a Windows 11 Build 22000 nebo Windows Server 2022 Build 20348 nebo novější.

HTTP.sys musí být nakonfigurované tak, aby používaly protokol TLS a HTTP/2. Další informace najdete v tématu HTTP.sys podpora HTTP/2 webového serveru.

Hostování gRPC v projektech non-ASP.NET Core

Server ASP.NET Core gRPC se obvykle vytváří ze šablony gRPC. Soubor projektu vytvořený šablonou se používá Microsoft.NET.SDK.Web jako sada SDK:

<Project Sdk="Microsoft.NET.Sdk.Web">

  <ItemGroup>
    <PackageReference Include="Grpc.AspNetCore" Version="2.47.0" />
    <Protobuf Include="Protos\greet.proto" GrpcServices="Server" />
  </ItemGroup>

</Project>

Microsoft.NET.SDK.Web Hodnota sady SDK automaticky přidá odkaz na architekturu ASP.NET Core. Odkaz umožňuje aplikaci používat typy ASP.NET Core vyžadované k hostování serveru.

Server gRPC můžete přidat do non-ASP.NET základních projektů s následujícím nastavením souboru projektu:

<Project Sdk="Microsoft.NET.Sdk">

  <ItemGroup>
    <PackageReference Include="Grpc.AspNetCore" Version="2.47.0" />
    <Protobuf Include="Protos\greet.proto" GrpcServices="Server" />
    
    <FrameworkReference Include="Microsoft.AspNetCore.App" />
  </ItemGroup>

</Project>

Předchozí soubor projektu:

  • Nepoužívá Microsoft.NET.SDK.Web jako SDK.
  • Přidá odkaz na architekturu do Microsoft.AspNetCore.App.
    • Referenční rámec umožňuje aplikacím mimo ASP.NET Core, jako jsou služby Windows, aplikace WPF nebo WinForms, používat rozhraní API ASP.NET Core.
    • Aplikace teď může ke spuštění serveru ASP.NET Core použít rozhraní API ASP.NET Core.
  • Přidá požadavky gRPC:

Další informace o použití referenční informace Microsoft.AspNetCore.App k rozhraní naleznete v tématu ASP.NET Core sdílené rozhraní.

Integrace s rozhraními API ASP.NET Core

Služby gRPC mají úplný přístup k funkcím ASP.NET Core, jako je vkládání závislostí (DI) a protokolování. Implementace služby může například získat protokolovací službu z kontejneru DI prostřednictvím konstruktoru:

public class GreeterService : Greeter.GreeterBase
{
    public GreeterService(ILogger<GreeterService> logger)
    {
    }
}

Ve výchozím nastavení může implementace služby gRPC vyřešit jiné služby DI s libovolnou životností (Singleton, Scoped nebo Transient).

Řešení HttpContext v metodách gRPC

Rozhraní gRPC API poskytuje přístup k některým datům zpráv HTTP/2, jako je metoda, hostitel, hlavička a trailery. Access je prostřednictvím argumentu ServerCallContext předaného každé metodě gRPC:

public class GreeterService : Greeter.GreeterBase
{
    public override Task<HelloReply> SayHello(
        HelloRequest request, ServerCallContext context)
    {
        return Task.FromResult(new HelloReply
        {
            Message = "Hello " + request.Name
        });
    }
}

ServerCallContext neposkytuje úplný přístup ke HttpContext všem rozhraním API ASP.NET. Metoda rozšíření GetHttpContext poskytuje úplný přístup k reprezentaci HttpContext základní zprávy HTTP/2 v rozhraních API ASP.NET.

public class GreeterService : Greeter.GreeterBase
{
    public override Task<HelloReply> SayHello(
        HelloRequest request, ServerCallContext context)
    {
        var httpContext = context.GetHttpContext();
        var clientCertificate = httpContext.Connection.ClientCertificate;

        return Task.FromResult(new HelloReply
        {
            Message = "Hello " + request.Name + " from " + clientCertificate.Issuer
        });
    }
}

Další materiály

Tento dokument ukazuje, jak začít se službami gRPC pomocí ASP.NET Core.

Požadavky

Úvod do služby gRPC v ASP.NET Core

Zobrazení nebo stažení vzorového kódu (postup stažení)

Podrobné pokyny k vytvoření projektu gRPC najdete v tématu Začínáme se službami gRPC.

Přidání služeb gRPC do aplikace ASP.NET Core

Pro gRPC se vyžaduje balíček Grpc.AspNetCore.

Konfigurace gRPC

V Program.cs:

  • gRPC je povoleno metodou AddGrpc.
  • Každá služba gRPC se přidá do kanálu směrování prostřednictvím MapGrpcService metody.
using GrpcGreeter.Services;

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.AddGrpc();

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();

Pokud chcete zobrazit komentáře ke kódu přeložené do jiných jazyků, než je angličtina, dejte nám vědět v této diskuzi na GitHubu.

ASP.NET Core middleware a funkce sdílejí kanál směrování, takže lze aplikaci nakonfigurovat tak, aby zpracovávala další obsluhy požadavků. Další obslužné rutiny žádostí, jako jsou kontrolery MVC, fungují paralelně s nakonfigurovanými službami gRPC.

Možnosti serveru

Služby gRPC můžou hostovat všechny integrované servery ASP.NET Core.

  • Kestrel
  • TestServer
  • IIS†
  • HTTP.sys†

†Vyžaduje .NET 5 a Windows 11 Build 22000 nebo Windows Server 2022 Build 20348 nebo novější.

Další informace o výběru správného serveru pro aplikaci ASP.NET Core najdete v tématu Implementace webového serveru v ASP.NET Core.

Kestrel

Kestrel je multiplatformní webový server pro ASP.NET Core. Kestrel zaměřuje se na vysoké využití výkonu a paměti, ale nemá některé pokročilé funkce v HTTP.sys, jako je sdílení portů.

Kestrel Koncové body gRPC:

HTTP/2

gRPC vyžaduje HTTP/2. gRPC pro ASP.NET Core ověřuje, že HttpRequest.Protocol je HTTP/2.

Kestrel podporuje PROTOKOL HTTP/2 ve většině moderních operačních systémů. Kestrel Koncové body jsou ve výchozím nastavení nakonfigurované tak, aby podporovaly připojení HTTP/1.1 a HTTP/2.

Protokol TLS

Kestrel koncové body používané pro gRPC by měly být zabezpečené pomocí protokolu TLS. Při vývoji se koncový bod zabezpečený protokolem TLS automaticky vytvoří https://localhost:5001 při přítomnosti vývojového certifikátu ASP.NET Core. Není nutná žádná konfigurace. Předpona https ověřuje, že Kestrel koncový bod používá protokol TLS.

V produkčním prostředí musí být protokol TLS explicitně nakonfigurovaný. V následujícím appsettings.json příkladu je k dispozici koncový bod HTTP/2 zabezpečený protokolem TLS:

{
  "Kestrel": {
    "Endpoints": {
      "HttpsInlineCertFile": {
        "Url": "https://localhost:5001",
        "Protocols": "Http2",
        "Certificate": {
          "Path": "<path to .pfx file>",
          "Password": "<certificate password>"
        }
      }
    }
  }
}

Alternativně je možné nakonfigurovat Kestrel koncové body v Program.cs:

var builder = WebApplication.CreateBuilder(args);

builder.WebHost.ConfigureKestrel(options =>
{
    options.Listen(IPAddress.Any, 5001, listenOptions =>
    {
        listenOptions.Protocols = HttpProtocols.Http2;
        listenOptions.UseHttps("<path to .pfx file>",
            "<certificate password>");
    });
});

Další informace o povolení protokolu TLS s Kestrel naleznete v části Kestrel Konfigurace koncového bodu HTTPS.

Vyjednávání protokolu

Protokol TLS se používá pro více než zabezpečení komunikace. Metoda handshake protokolu TLS Application-Layer Protocol (ALPN) se používá k vyjednávání protokolu připojení mezi klientem a serverem, když koncový bod podporuje více protokolů. Toto vyjednávání určuje, jestli připojení používá protokol HTTP/1.1 nebo HTTP/2.

Pokud je koncový bod HTTP/2 nakonfigurovaný bez protokolu TLS, musí být parametr ListenOptions.Protocols koncového bodu HttpProtocols.Http2 Koncový bod s několika protokoly, jako například HttpProtocols.Http1AndHttp2, nelze použít bez TLS, protože neexistuje žádné vyjednávání. Všechna připojení k nezabezpečeným koncovým bodům jsou ve výchozím nastavení nastavena na HTTP/1.1 a volání gRPC selžou.

Další informace o povolení protokolu HTTP/2 a TLS s Kestrel najdete v tématu konfigurace koncového bodu Kestrel.

Poznámka:

macOS nepodporuje ASP.NET Core gRPC s protokolem TLS před .NET 8. K úspěšnému spuštění služeb gRPC v systému macOS při použití rozhraní .NET 7 nebo starších se vyžaduje další konfigurace. Další informace najdete v tématu Nejde spustit aplikaci ASP.NET Core gRPC v systému macOS.

IIS

Internetová informační služba (IIS) je flexibilní, zabezpečený a spravovatelný webový server pro hostování webových aplikací, včetně ASP.NET Core. K hostování služeb gRPC ve službě IIS se vyžadují .NET 5 a Windows 11 Build 22000 nebo Windows Server 2022 Build 20348 nebo novější.

Služba IIS musí být nakonfigurovaná tak, aby používala protokol TLS a HTTP/2. Další informace naleznete v tématu Použití ASP.NET Core s HTTP/2 ve službě IIS.

HTTP.sys

HTTP.sys je webový server pro ASP.NET Core, který běží jenom ve Windows. K hostování služeb gRPC s HTTP.sys se vyžadují .NET 5 a Windows 11 Build 22000 nebo Windows Server 2022 Build 20348 nebo novější.

HTTP.sys musí být nakonfigurované tak, aby používaly protokol TLS a HTTP/2. Další informace najdete v tématu HTTP.sys podpora HTTP/2 webového serveru.

Hostování gRPC v projektech non-ASP.NET Core

Server ASP.NET Core gRPC se obvykle vytváří ze šablony gRPC. Soubor projektu vytvořený šablonou se používá Microsoft.NET.SDK.Web jako sada SDK:

<Project Sdk="Microsoft.NET.Sdk.Web">

  <ItemGroup>
    <PackageReference Include="Grpc.AspNetCore" Version="2.47.0" />
    <Protobuf Include="Protos\greet.proto" GrpcServices="Server" />
  </ItemGroup>

</Project>

Microsoft.NET.SDK.Web Hodnota sady SDK automaticky přidá odkaz na architekturu ASP.NET Core. Odkaz umožňuje aplikaci používat typy ASP.NET Core vyžadované k hostování serveru.

Server gRPC můžete přidat do non-ASP.NET základních projektů s následujícím nastavením souboru projektu:

<Project Sdk="Microsoft.NET.Sdk">

  <ItemGroup>
    <PackageReference Include="Grpc.AspNetCore" Version="2.47.0" />
    <Protobuf Include="Protos\greet.proto" GrpcServices="Server" />
    
    <FrameworkReference Include="Microsoft.AspNetCore.App" />
  </ItemGroup>

</Project>

Předchozí soubor projektu:

  • Jako SDK se Microsoft.NET.SDK.Web nepoužívá.
  • Přidá odkaz na architekturu do Microsoft.AspNetCore.App.
    • Referenční architektura umožňuje ne-ASP.NET Core aplikacím, jako jsou služby Windows, aplikace WPF nebo aplikace WinForms, používat ASP.NET Core API.
    • Aplikace teď může ke spuštění serveru ASP.NET Core použít rozhraní API ASP.NET Core.
  • Přidá požadavky gRPC:

Další informace o použití referenční informace Microsoft.AspNetCore.App k rozhraní naleznete v tématu ASP.NET Core sdílené rozhraní.

Integrace s rozhraními API ASP.NET Core

Služby gRPC mají plný přístup k funkcím ASP.NET Core, jako je vkládání závislostí (DI) a protokolování. Implementace služby může například získat protokolovací službu z DI kontejneru prostřednictvím konstruktoru:

public class GreeterService : Greeter.GreeterBase
{
    public GreeterService(ILogger<GreeterService> logger)
    {
    }
}

Ve výchozím nastavení může implementace služby gRPC vyřešit jiné služby DI s libovolnou životností (Singleton, Scoped nebo Transient).

Řešit HttpContext v metodách gRPC

Rozhraní gRPC API poskytuje přístup k některým údajům zpráv HTTP/2, jako je metoda, hostitel, hlavička a trailery. Access je prostřednictvím argumentu ServerCallContext předaného každé metodě gRPC:

public class GreeterService : Greeter.GreeterBase
{
    public override Task<HelloReply> SayHello(
        HelloRequest request, ServerCallContext context)
    {
        return Task.FromResult(new HelloReply
        {
            Message = "Hello " + request.Name
        });
    }
}

ServerCallContext neposkytuje úplný přístup ke HttpContext všem rozhraním API ASP.NET. Metoda GetHttpContext rozšíření poskytuje úplný přístup k HttpContext reprezentaci základní zprávy HTTP/2 v rozhraních API ASP.NET:

public class GreeterService : Greeter.GreeterBase
{
    public override Task<HelloReply> SayHello(
        HelloRequest request, ServerCallContext context)
    {
        var httpContext = context.GetHttpContext();
        var clientCertificate = httpContext.Connection.ClientCertificate;

        return Task.FromResult(new HelloReply
        {
            Message = "Hello " + request.Name + " from " + clientCertificate.Issuer
        });
    }
}

Další materiály

Tento dokument ukazuje, jak začít se službami gRPC pomocí ASP.NET Core.

Požadavky

Začněte se službou gRPC v ASP.NET Core

Zobrazení nebo stažení vzorového kódu (postup stažení)

Podrobné pokyny k vytvoření projektu gRPC najdete v tématu Začínáme se službami gRPC.

Přidání služeb gRPC do aplikace ASP.NET Core

Pro gRPC se vyžaduje balíček Grpc.AspNetCore.

Konfiguruj gRPC

V Startup.cs:

  • gRPC je povolen pomocí metody AddGrpc.
  • Každá služba gRPC se přidá do kanálu směrování prostřednictvím MapGrpcService metody.
public class Startup
{
    // This method gets called by the runtime. Use this method to add services to the container.
    // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddGrpc();
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }

        app.UseRouting();

        app.UseEndpoints(endpoints =>
        {
            // 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
            endpoints.MapGrpcService<GreeterService>();
        });
    }
}

Pokud chcete zobrazit komentáře ke kódu přeložené do jiných jazyků, než je angličtina, dejte nám vědět v této diskuzi na GitHubu.

Middleware ASP.NET Core a funkce sdílejí kanál směrování, proto je možné aplikaci nakonfigurovat tak, aby zpracovávala další obslužné rutiny požadavků. Další obslužné rutiny žádostí, jako jsou kontrolery MVC, fungují paralelně s nakonfigurovanými službami gRPC.

Možnosti serveru

Služby gRPC můžou hostovat všechny integrované servery ASP.NET Core.

  • Kestrel
  • TestServer
  • IIS†
  • HTTP.sys†

†Vyžaduje .NET 5 a Windows 11 build 22000 nebo Windows Server 2022 build 20348 nebo novější.

Další informace o výběru správného serveru pro aplikaci ASP.NET Core najdete v tématu Implementace webového serveru v ASP.NET Core.

Kestrel

Kestrel je multiplatformní webový server pro ASP.NET Core. Kestrel zaměřuje se na vysoké využití výkonu a paměti, ale nemá některé pokročilé funkce v HTTP.sys, jako je sdílení portů.

Kestrel Koncové body gRPC:

HTTP/2

gRPC vyžaduje HTTP/2. gRPC pro ASP.NET Core ověřuje , že httpRequest.Protocol je HTTP/2.

Kestrel podporuje PROTOKOL HTTP/2 ve většině moderních operačních systémů. Kestrel Koncové body jsou ve výchozím nastavení nakonfigurované tak, aby podporovaly připojení HTTP/1.1 a HTTP/2.

Protokol TLS

Kestrel koncové body používané pro gRPC by měly být zabezpečené pomocí protokolu TLS. Při vývoji se koncový bod zabezpečený protokolem TLS automaticky vytvoří https://localhost:5001 při přítomnosti vývojového certifikátu ASP.NET Core. Není nutná žádná konfigurace. Předpona https ověřuje, že Kestrel koncový bod používá protokol TLS.

V produkčním prostředí musí být protokol TLS explicitně nakonfigurovaný. V následujícím appsettings.json příkladu je k dispozici koncový bod HTTP/2 zabezpečený protokolem TLS:

{
  "Kestrel": {
    "Endpoints": {
      "HttpsInlineCertFile": {
        "Url": "https://localhost:5001",
        "Protocols": "Http2",
        "Certificate": {
          "Path": "<path to .pfx file>",
          "Password": "<certificate password>"
        }
      }
    }
  }
}

Alternativně lze nakonfigurovat koncové body v Program.cs:

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.ConfigureKestrel(options =>
            {
                options.Listen(IPAddress.Any, 5001, listenOptions =>
                {
                    listenOptions.Protocols = HttpProtocols.Http2;
                    listenOptions.UseHttps("<path to .pfx file>", 
                        "<certificate password>");
                });
            });
            webBuilder.UseStartup<Startup>();
        });

Další informace o povolení protokolu TLS s Kestrel naleznete v tématu Kestrel Konfigurace koncového bodu HTTPS.

Vyjednávání protokolu

Protokol TLS se používá pro více než zabezpečení komunikace. Metoda handshake protokolu TLS Application-Layer Protocol (ALPN) se používá k vyjednávání protokolu připojení mezi klientem a serverem, když koncový bod podporuje více protokolů. Toto vyjednávání určuje, jestli připojení používá protokol HTTP/1.1 nebo HTTP/2.

Pokud je koncový bod HTTP/2 nakonfigurovaný bez protokolu TLS, musí být parametr ListenOptions.Protocols koncového bodu HttpProtocols.Http2 Koncový bod s několika protokoly, jako například HttpProtocols.Http1AndHttp2, se nedá použít bez použití TLS, protože neexistuje žádné vyjednávání. Všechna připojení k nezabezpečeným koncovým bodům standardně používají HTTP/1.1, a volání gRPC selžou.

Další informace o povolení protokolu HTTP/2 a TLS s využitím Kestrel najdete v tématu Kestrel konfigurace koncového bodu.

Poznámka:

macOS nepodporuje ASP.NET Core gRPC s protokolem TLS před .NET 8. K úspěšnému spuštění služeb gRPC v systému macOS při použití rozhraní .NET 7 nebo starších se vyžaduje další konfigurace. Další informace najdete v tématu Nejde spustit aplikaci ASP.NET Core gRPC v systému macOS.

IIS

Internetová informační služba (IIS) je flexibilní, zabezpečený a spravovatelný webový server pro hostování webových aplikací, včetně ASP.NET Core. K hostování služeb gRPC ve službě IIS se vyžadují .NET 5 a Windows 11 Build 22000 nebo Windows Server 2022 Build 20348 nebo novější.

Služba IIS musí být nakonfigurovaná tak, aby používala protokol TLS a HTTP/2. Další informace naleznete v tématu Použití ASP.NET Core s HTTP/2 ve službě IIS.

HTTP.sys

HTTP.sys je webový server pro ASP.NET Core, který běží jenom ve Windows. K hostování služeb gRPC s HTTP.sys se vyžadují .NET 5 a Windows 11 Build 22000 nebo Windows Server 2022 Build 20348 nebo novější.

HTTP.sys musí být nakonfigurované tak, aby používaly protokol TLS a HTTP/2. Další informace najdete v tématu HTTP.sys podpora HTTP/2 webového serveru.

Hostování gRPC v projektech non-ASP.NET Core

Server ASP.NET Core gRPC se obvykle vytváří ze šablony gRPC. Soubor projektu vytvořený šablonou se používá Microsoft.NET.SDK.Web jako sada SDK:

<Project Sdk="Microsoft.NET.Sdk.Web">

  <ItemGroup>
    <PackageReference Include="Grpc.AspNetCore" Version="2.47.0" />
    <Protobuf Include="Protos\greet.proto" GrpcServices="Server" />
  </ItemGroup>

</Project>

Microsoft.NET.SDK.Web Hodnota sady SDK automaticky přidá odkaz na architekturu ASP.NET Core. Odkaz umožňuje aplikaci používat typy ASP.NET Core vyžadované k hostování serveru.

Server gRPC můžete přidat do non-ASP.NET základních projektů s následujícím nastavením souboru projektu:

<Project Sdk="Microsoft.NET.Sdk">

  <ItemGroup>
    <PackageReference Include="Grpc.AspNetCore" Version="2.47.0" />
    <Protobuf Include="Protos\greet.proto" GrpcServices="Server" />
    
    <FrameworkReference Include="Microsoft.AspNetCore.App" />
  </ItemGroup>

</Project>

Předchozí soubor projektu:

  • Jako SDK se nepoužívá Microsoft.NET.SDK.Web.
  • Přidá odkaz na architekturu do Microsoft.AspNetCore.App.
    • Referenční informace k architektuře umožňují ne-ASP.NET Core aplikacím, jako jsou služby Windows, aplikace WPF nebo aplikace WinForms, používat ASP.NET Core rozhraní API.
    • Aplikace teď může ke spuštění serveru ASP.NET Core použít rozhraní API ASP.NET Core.
  • Přidá požadavky gRPC:

Další informace o použití referenční informace Microsoft.AspNetCore.App k rozhraní naleznete v tématu ASP.NET Core sdílené rozhraní.

Integrace s rozhraními API ASP.NET Core

Služby gRPC mají úplný přístup k funkcím ASP.NET Core, jako je vkládání závislostí (DI) a protokolování. Implementace služby může například získat službu loggeru z kontejneru DI prostřednictvím konstruktoru.

public class GreeterService : Greeter.GreeterBase
{
    public GreeterService(ILogger<GreeterService> logger)
    {
    }
}

Ve výchozím nastavení může implementace služby gRPC vyřešit jiné služby DI s libovolnou životností (Singleton, Scoped nebo Transient).

Řešení HttpContext v metodách gRPC

Rozhraní gRPC API poskytuje přístup k některým datům zpráv HTTP/2, jako je metoda, hostitel, hlavička a přívěsy. Access je prostřednictvím argumentu ServerCallContext předaného každé metodě gRPC:

public class GreeterService : Greeter.GreeterBase
{
    public override Task<HelloReply> SayHello(
        HelloRequest request, ServerCallContext context)
    {
        return Task.FromResult(new HelloReply
        {
            Message = "Hello " + request.Name
        });
    }
}

ServerCallContext neposkytuje úplný přístup ke HttpContext všem rozhraním API ASP.NET. Metoda rozšíření GetHttpContext poskytuje úplný přístup k HttpContext představující základní zprávu HTTP/2 v rozhraních API ASP.NET.

public class GreeterService : Greeter.GreeterBase
{
    public override Task<HelloReply> SayHello(
        HelloRequest request, ServerCallContext context)
    {
        var httpContext = context.GetHttpContext();
        var clientCertificate = httpContext.Connection.ClientCertificate;

        return Task.FromResult(new HelloReply
        {
            Message = "Hello " + request.Name + " from " + clientCertificate.Issuer
        });
    }
}

Další materiály

Tento dokument ukazuje, jak začít se službami gRPC pomocí ASP.NET Core.

Požadavky

Začínáme s implementací služby gRPC v ASP.NET Core

Zobrazení nebo stažení vzorového kódu (postup stažení)

Podrobné pokyny k vytvoření projektu gRPC najdete v tématu Začínáme se službami gRPC.

Přidání služeb gRPC do aplikace ASP.NET Core

Pro gRPC se vyžaduje balíček Grpc.AspNetCore.

Nakonfigurujte gRPC

V Startup.cs:

  • gRPC je povolen pomocí metody AddGrpc.
  • Každá služba gRPC se přidá do kanálu směrování prostřednictvím MapGrpcService metody.
public class Startup
{
    // This method gets called by the runtime. Use this method to add services to the container.
    // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddGrpc();
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }

        app.UseRouting();

        app.UseEndpoints(endpoints =>
        {
            // 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
            endpoints.MapGrpcService<GreeterService>();
        });
    }
}

Pokud chcete zobrazit komentáře ke kódu přeložené do jiných jazyků, než je angličtina, dejte nám vědět v této diskuzi na GitHubu.

ASP.NET Core middleware a funkce sdílejí kanál routování, takže lze aplikaci nakonfigurovat tak, aby obsluhovala další obslužné rutiny požadavků. Další obslužné rutiny žádostí, jako jsou kontrolery MVC, fungují paralelně s nakonfigurovanými službami gRPC.

Možnosti serveru

Služby gRPC můžou hostovat všechny integrované servery ASP.NET Core.

  • Kestrel
  • TestServer
  • IIS†
  • HTTP.sys†

†Vyžaduje .NET 5 a Windows 11 build 22000 nebo Windows Server 2022 build 20348 nebo novější.

Další informace o výběru správného serveru pro aplikaci ASP.NET Core najdete v tématu Implementace webového serveru v ASP.NET Core.

Kestrel

Kestrel je multiplatformní webový server pro ASP.NET Core. Kestrel zaměřuje se na vysoké využití výkonu a paměti, ale nemá některé pokročilé funkce v HTTP.sys, jako je sdílení portů.

Kestrel Koncové body gRPC:

HTTP/2

gRPC vyžaduje HTTP/2. gRPC pro ASP.NET Core ověřuje , že httpRequest.Protocol je HTTP/2.

Kestrel podporuje PROTOKOL HTTP/2 ve většině moderních operačních systémů. Kestrel Koncové body jsou ve výchozím nastavení nakonfigurované tak, aby podporovaly připojení HTTP/1.1 a HTTP/2.

Protokol TLS

Kestrel koncové body používané pro gRPC by měly být zabezpečené pomocí protokolu TLS. Při vývoji se koncový bod zabezpečený protokolem TLS automaticky vytvoří https://localhost:5001 při přítomnosti vývojového certifikátu ASP.NET Core. Není nutná žádná konfigurace. Předpona https ověřuje, že Kestrel koncový bod používá protokol TLS.

V produkčním prostředí musí být protokol TLS explicitně nakonfigurovaný. V následujícím appsettings.json příkladu je k dispozici koncový bod HTTP/2 zabezpečený protokolem TLS:

{
  "Kestrel": {
    "Endpoints": {
      "HttpsInlineCertFile": {
        "Url": "https://localhost:5001",
        "Protocols": "Http2",
        "Certificate": {
          "Path": "<path to .pfx file>",
          "Password": "<certificate password>"
        }
      }
    }
  }
}

Alternativně mohou být Kestrel koncové body nakonfigurovány v Program.cs:

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.ConfigureKestrel(options =>
            {
                options.Listen(IPAddress.Any, 5001, listenOptions =>
                {
                    listenOptions.Protocols = HttpProtocols.Http2;
                    listenOptions.UseHttps("<path to .pfx file>", 
                        "<certificate password>");
                });
            });
            webBuilder.UseStartup<Startup>();
        });

Další informace o povolení protokolu TLS pomocí Kestrel najdete v tématu Kestrel Konfigurace koncového bodu HTTPS.

Vyjednávání protokolu

Protokol TLS se používá pro více než zabezpečení komunikace. Metoda handshake protokolu TLS Application-Layer Protocol (ALPN) se používá k vyjednávání protokolu připojení mezi klientem a serverem, když koncový bod podporuje více protokolů. Toto vyjednávání určuje, jestli připojení používá protokol HTTP/1.1 nebo HTTP/2.

Pokud je koncový bod HTTP/2 nakonfigurovaný bez protokolu TLS, musí být parametr ListenOptions.Protocols koncového bodu HttpProtocols.Http2 Koncový bod s více protokoly, jako je například HttpProtocols.Http1AndHttp2, nelze použít bez TLS, protože neexistuje žádné vyjednávání. Ve výchozím nastavení se všechna připojení k nezabezpečenému koncovému bodu používají protokol HTTP/1.1 a volání gRPC selžou.

Další informace o povolení protokolu HTTP/2 a TLS s využitím Kestrel naleznete v části Kestrel konfigurace koncového bodu.

Poznámka:

macOS nepodporuje ASP.NET Core gRPC s protokolem TLS před .NET 8. K úspěšnému spuštění služeb gRPC v systému macOS při použití rozhraní .NET 7 nebo starších se vyžaduje další konfigurace. Další informace najdete v tématu Nejde spustit aplikaci ASP.NET Core gRPC v systému macOS.

Hostování gRPC v projektech non-ASP.NET Core

Server ASP.NET Core gRPC se obvykle vytváří ze šablony gRPC. Soubor projektu vytvořený šablonou se používá Microsoft.NET.SDK.Web jako sada SDK:

<Project Sdk="Microsoft.NET.Sdk.Web">

  <ItemGroup>
    <PackageReference Include="Grpc.AspNetCore" Version="2.47.0" />
    <Protobuf Include="Protos\greet.proto" GrpcServices="Server" />
  </ItemGroup>

</Project>

Microsoft.NET.SDK.Web Hodnota sady SDK automaticky přidá odkaz na architekturu ASP.NET Core. Odkaz umožňuje aplikaci používat typy ASP.NET Core vyžadované k hostování serveru.

Server gRPC můžete přidat do non-ASP.NET základních projektů s následujícím nastavením souboru projektu:

<Project Sdk="Microsoft.NET.Sdk">

  <ItemGroup>
    <PackageReference Include="Grpc.AspNetCore" Version="2.47.0" />
    <Protobuf Include="Protos\greet.proto" GrpcServices="Server" />
    
    <FrameworkReference Include="Microsoft.AspNetCore.App" />
  </ItemGroup>

</Project>

Předchozí soubor projektu:

  • Microsoft.NET.SDK.Web jako SDK se nepoužívá.
  • Přidá odkaz na architekturu do Microsoft.AspNetCore.App.
    • Referenční rámec umožňuje ne-ASP.NET Core aplikacím, jako jsou služby Windows, aplikace WPF nebo aplikace WinForms, používat rozhraní API ASP.NET Core.
    • Aplikace teď může ke spuštění serveru ASP.NET Core použít rozhraní API ASP.NET Core.
  • Přidá požadavky gRPC:

Další informace o použití referenční informace Microsoft.AspNetCore.App k rozhraní naleznete v tématu ASP.NET Core sdílené rozhraní.

Integrace s rozhraními API ASP.NET Core

Služby gRPC mají úplný přístup k funkcím ASP.NET Core, například Dependency Injection (injektáž závislostí, DI) a Logging (protokolování). Implementace služby může například získat službu protokolování z DI kontejneru prostřednictvím konstruktoru.

public class GreeterService : Greeter.GreeterBase
{
    public GreeterService(ILogger<GreeterService> logger)
    {
    }
}

Ve výchozím nastavení může implementace služby gRPC vyřešit jiné služby DI s libovolnou životností (Singleton, Scoped nebo Transient).

Řešení HttpContext v metodách gRPC

Rozhraní gRPC API poskytuje přístup k některým datům zpráv HTTP/2, jako je metoda, hostitel, hlavička a přívěsy. Access je prostřednictvím argumentu ServerCallContext předaného každé metodě gRPC:

public class GreeterService : Greeter.GreeterBase
{
    public override Task<HelloReply> SayHello(
        HelloRequest request, ServerCallContext context)
    {
        return Task.FromResult(new HelloReply
        {
            Message = "Hello " + request.Name
        });
    }
}

ServerCallContext neposkytuje úplný přístup ke HttpContext všem rozhraním API ASP.NET. Rozšiřující metoda GetHttpContext poskytuje plný přístup k HttpContext, který reprezentuje základní zprávu HTTP/2 v rozhraních API ASP.NET.

public class GreeterService : Greeter.GreeterBase
{
    public override Task<HelloReply> SayHello(
        HelloRequest request, ServerCallContext context)
    {
        var httpContext = context.GetHttpContext();
        var clientCertificate = httpContext.Connection.ClientCertificate;

        return Task.FromResult(new HelloReply
        {
            Message = "Hello " + request.Name + " from " + clientCertificate.Issuer
        });
    }
}

Další materiály

Tento dokument ukazuje, jak začít se službami gRPC pomocí ASP.NET Core.

Požadavky

Začínáme se službou gRPC v ASP.NET Core

Zobrazení nebo stažení vzorového kódu (postup stažení)

Podrobné pokyny k vytvoření projektu gRPC najdete v tématu Začínáme se službami gRPC.

Přidání služeb gRPC do aplikace ASP.NET Core

Pro gRPC se vyžaduje balíček Grpc.AspNetCore.

Konfigurace gRPC

V Startup.cs:

  • gRPC je povoleno pomocí metody AddGrpc.
  • Každá služba gRPC se přidá do kanálu směrování prostřednictvím MapGrpcService metody.
public class Startup
{
    // This method gets called by the runtime. Use this method to add services to the container.
    // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddGrpc();
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }

        app.UseRouting();

        app.UseEndpoints(endpoints =>
        {
            // 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
            endpoints.MapGrpcService<GreeterService>();
        });
    }
}

Pokud chcete zobrazit komentáře ke kódu přeložené do jiných jazyků, než je angličtina, dejte nám vědět v této diskuzi na GitHubu.

ASP.NET Core middleware a funkce sdílejí směrovací kanál, proto je možné aplikaci nakonfigurovat tak, aby obsluhovala dodatečné obslužné rutiny požadavků. Další obslužné rutiny žádostí, jako jsou kontrolery MVC, fungují paralelně s nakonfigurovanými službami gRPC.

Možnosti serveru

Služby gRPC můžou hostovat všechny integrované servery ASP.NET Core.

  • Kestrel
  • TestServer
  • IIS†
  • HTTP.sys†

†Vyžaduje .NET 5 a Windows 11 build 22000 nebo Windows Server 2022 build 20348 nebo novější verzí.

Další informace o výběru správného serveru pro aplikaci ASP.NET Core najdete v tématu Implementace webového serveru v ASP.NET Core.

Kestrel

Kestrel je multiplatformní webový server pro ASP.NET Core. Kestrel zaměřuje se na vysoké využití výkonu a paměti, ale nemá některé pokročilé funkce v HTTP.sys, jako je sdílení portů.

Kestrel Koncové body gRPC:

HTTP/2

gRPC vyžaduje HTTP/2. gRPC pro ASP.NET Core ověřuje , že httpRequest.Protocol je HTTP/2.

Kestrel podporuje PROTOKOL HTTP/2 ve většině moderních operačních systémů. Kestrel Koncové body jsou ve výchozím nastavení nakonfigurované tak, aby podporovaly připojení HTTP/1.1 a HTTP/2.

Protokol TLS

Kestrel koncové body používané pro gRPC by měly být zabezpečené pomocí protokolu TLS. Při vývoji se koncový bod zabezpečený protokolem TLS automaticky vytvoří https://localhost:5001 při přítomnosti vývojového certifikátu ASP.NET Core. Není nutná žádná konfigurace. Předpona https ověřuje, že Kestrel koncový bod používá protokol TLS.

V produkčním prostředí musí být protokol TLS explicitně nakonfigurovaný. V následujícím appsettings.json příkladu je k dispozici koncový bod HTTP/2 zabezpečený protokolem TLS:

{
  "Kestrel": {
    "Endpoints": {
      "HttpsInlineCertFile": {
        "Url": "https://localhost:5001",
        "Protocols": "Http2",
        "Certificate": {
          "Path": "<path to .pfx file>",
          "Password": "<certificate password>"
        }
      }
    }
  }
}

Je možné alternativně nakonfigurovat Kestrel koncové body v Program.cs:

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.ConfigureKestrel(options =>
            {
                options.Listen(IPAddress.Any, 5001, listenOptions =>
                {
                    listenOptions.Protocols = HttpProtocols.Http2;
                    listenOptions.UseHttps("<path to .pfx file>", 
                        "<certificate password>");
                });
            });
            webBuilder.UseStartup<Startup>();
        });

Další informace o povolení protokolu TLS s Kestrel, najdete v tématu Kestrel Konfigurace koncového bodu HTTPS.

Vyjednávání protokolu

Protokol TLS se používá pro více než zabezpečení komunikace. Metoda handshake protokolu TLS Application-Layer Protocol (ALPN) se používá k vyjednávání protokolu připojení mezi klientem a serverem, když koncový bod podporuje více protokolů. Toto vyjednávání určuje, jestli připojení používá protokol HTTP/1.1 nebo HTTP/2.

Pokud je koncový bod HTTP/2 nakonfigurovaný bez protokolu TLS, musí být parametr ListenOptions.Protocols koncového bodu HttpProtocols.Http2 Koncový bod s několika protokoly, jako například HttpProtocols.Http1AndHttp2, nelze použít bez protokolu TLS, protože neexistuje žádné vyjednávání. Všechna připojení k nezabezpečeným koncovým bodům se ve výchozím nastavení přepnou na HTTP/1.1 a volání gRPC selžou.

Další informace o povolení protokolu HTTP/2 a TLS s Kestrel najdete v tématu Kestrel konfigurace koncového bodu.

Poznámka:

macOS nepodporuje ASP.NET Core gRPC s protokolem TLS před .NET 8. K úspěšnému spuštění služeb gRPC v systému macOS při použití rozhraní .NET 7 nebo starších se vyžaduje další konfigurace. Další informace najdete v tématu Nejde spustit aplikaci ASP.NET Core gRPC v systému macOS.

Hostování gRPC v projektech non-ASP.NET Core

Server ASP.NET Core gRPC se obvykle vytváří ze šablony gRPC. Soubor projektu vytvořený šablonou se používá Microsoft.NET.SDK.Web jako sada SDK:

<Project Sdk="Microsoft.NET.Sdk.Web">

  <ItemGroup>
    <PackageReference Include="Grpc.AspNetCore" Version="2.47.0" />
    <Protobuf Include="Protos\greet.proto" GrpcServices="Server" />
  </ItemGroup>

</Project>

Microsoft.NET.SDK.Web Hodnota sady SDK automaticky přidá odkaz na architekturu ASP.NET Core. Odkaz umožňuje aplikaci používat typy ASP.NET Core vyžadované k hostování serveru.

Server gRPC můžete přidat do non-ASP.NET základních projektů s následujícím nastavením souboru projektu:

<Project Sdk="Microsoft.NET.Sdk">

  <ItemGroup>
    <PackageReference Include="Grpc.AspNetCore" Version="2.47.0" />
    <Protobuf Include="Protos\greet.proto" GrpcServices="Server" />
    
    <FrameworkReference Include="Microsoft.AspNetCore.App" />
  </ItemGroup>

</Project>

Předchozí soubor projektu:

  • Nepoužívá Microsoft.NET.SDK.Web jako SDK.
  • Přidá odkaz na framework do Microsoft.AspNetCore.App.
    • Odkaz v rámci frameworku umožňuje ne-ASP.NET Core aplikacím, jako jsou služby Windows, aplikace WPF nebo aplikace WinForms, používat ASP.NET Core API.
    • Aplikace teď může ke spuštění serveru ASP.NET Core použít rozhraní API ASP.NET Core.
  • Přidá požadavky gRPC:

Další informace o použití referenční informace Microsoft.AspNetCore.App k rozhraní naleznete v tématu ASP.NET Core sdílené rozhraní.

Integrace s rozhraními API ASP.NET Core

Služby gRPC mají úplný přístup k funkcím ASP.NET Core, jako je závislostní injektáž (DI) a logování. Implementace služby může například získat službu logaře z kontejneru DI prostřednictvím konstruktoru.

public class GreeterService : Greeter.GreeterBase
{
    public GreeterService(ILogger<GreeterService> logger)
    {
    }
}

Ve výchozím nastavení může implementace služby gRPC vyřešit jiné služby DI s libovolnou životností (Singleton, Scoped nebo Transient).

Vyřešit HttpContext v metodách gRPC

Rozhraní gRPC API poskytuje přístup k některým datům zpráv HTTP/2, jako je metoda, hostitel, hlavička a přívěsy. Access je prostřednictvím argumentu ServerCallContext předaného každé metodě gRPC:

public class GreeterService : Greeter.GreeterBase
{
    public override Task<HelloReply> SayHello(
        HelloRequest request, ServerCallContext context)
    {
        return Task.FromResult(new HelloReply
        {
            Message = "Hello " + request.Name
        });
    }
}

ServerCallContext neposkytuje úplný přístup ke HttpContext všem rozhraním API ASP.NET. Metoda GetHttpContext rozšíření poskytuje úplný přístup k HttpContext reprezentaci podkladové zprávy HTTP/2 v rámci rozhraní API ASP.NET.

public class GreeterService : Greeter.GreeterBase
{
    public override Task<HelloReply> SayHello(
        HelloRequest request, ServerCallContext context)
    {
        var httpContext = context.GetHttpContext();
        var clientCertificate = httpContext.Connection.ClientCertificate;

        return Task.FromResult(new HelloReply
        {
            Message = "Hello " + request.Name + " from " + clientCertificate.Issuer
        });
    }
}

Další materiály