Usługi gRPC na platformie ASP.NET Core
Uwaga
Nie jest to najnowsza wersja tego artykułu. Aby zapoznać się z bieżącą wersją, zobacz wersję tego artykułu dla platformy .NET 9.
Ważne
Te informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany, zanim zostanie wydany komercyjnie. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
Aby zapoznać się z bieżącą wersją, zobacz wersję artykułu .NET 9.
W tym dokumencie pokazano, jak rozpocząć pracę z usługami gRPC przy użyciu ASP.NET Core.
Wymagania wstępne
Program Visual Studio 2022 z pakietem roboczym tworzenia aplikacji ASP.NET i webowych.
Wprowadzenie do usługi gRPC na platformie ASP.NET Core
Wyświetl lub pobierz przykładowy kod (jak pobrać).
Aby uzyskać szczegółowe instrukcje dotyczące tworzenia projektu gRPC, zobacz Wprowadzenie do usług gRPC.
Dodawanie usługi gRPC do aplikacji ASP.NET Core
Usługa gRPC wymaga pakietu Grpc.AspNetCore.
Konfigurowanie usługi gRPC
W pliku Program.cs
:
- gRPC jest włączone za pomocą metody
AddGrpc
. - Każda usługa gRPC jest dodawana do potoku routingu za pomocą metody
MapGrpcService
.
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();
Jeśli chcesz zobaczyć komentarze kodu przetłumaczone na języki inne niż angielski, poinformuj nas o tym w tym problemie z dyskusją w usłudze GitHub.
ASP.NET Core middleware i funkcje dzielą się potokiem routingu, dlatego można skonfigurować aplikację do obsługi dodatkowych procedur obsługi żądań. Dodatkowe programy obsługi żądań, takie jak kontrolery MVC, działają równolegle ze skonfigurowanymi usługami gRPC.
Opcje serwera
Usługi gRPC mogą być hostowane przez wszystkie wbudowane serwery ASP.NET Core.
- Kestrel
- Serwer testowy
- IIS
- HTTP.sys†
†Wymaga programu .NET 5 i Windows 11 Build 22000 lub Windows Server 2022 Build 20348 lub nowszego.
Aby uzyskać więcej informacji na temat wybierania odpowiedniego serwera dla aplikacji ASP.NET Core, zobacz Implementacje serwera sieci Web w ASP.NET Core.
Kestrel
Kestrel to międzyplatformowy serwer internetowy dla platformy ASP.NET Core. Kestrel koncentruje się na wysokiej wydajności i wykorzystaniu pamięci, ale nie ma niektórych zaawansowanych funkcji w HTTP.sys, takich jak udostępnianie portów.
Kestrel Punkty końcowe gRPC:
- Wymagaj protokołu HTTP/2.
- Należy zabezpieczyć przy użyciu protokołu Transport Layer Security (TLS).
HTTP/2
GRPC wymaga protokołu HTTP/2. gRPC dla ASP.NET Core weryfikuje, czy HttpRequest.Protocol jest HTTP/2
.
Kestrel obsługuje protokół HTTP/2 w większości nowoczesnych systemów operacyjnych. Kestrel Punkty końcowe są domyślnie skonfigurowane do obsługi połączeń HTTP/1.1 i HTTP/2.
TLS
Kestrel punkty końcowe używane na potrzeby gRPC powinny być zabezpieczone przy użyciu protokołu TLS. Podczas tworzenia punkt końcowy zabezpieczony protokołem TLS jest automatycznie tworzony pod adresem https://localhost:5001
, gdy obecny jest certyfikat deweloperski ASP.NET Core. Nie jest wymagana żadna konfiguracja. Prefiks https
sprawdza, Kestrel czy punkt końcowy używa protokołu TLS.
W środowisku produkcyjnym protokół TLS musi być jawnie skonfigurowany. W poniższym appsettings.json
przykładzie podano punkt końcowy HTTP/2 zabezpieczony przy użyciu protokołu TLS:
{
"Kestrel": {
"Endpoints": {
"HttpsInlineCertFile": {
"Url": "https://localhost:5001",
"Protocols": "Http2",
"Certificate": {
"Path": "<path to .pfx file>",
"Password": "<certificate password>"
}
}
}
}
}
Alternatywnie Kestrel punkty końcowe można skonfigurować w 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>");
});
});
Aby uzyskać więcej informacji na temat włączania protokołu TLS z Kestrel, zobacz konfigurację punktu końcowego HTTPS.
Negocjowanie protokołu
Protokół TLS jest używany nie tylko do zabezpieczania komunikacji. Uzgadnianie negocjacji protokołu TLS w warstwie aplikacji (ALPN) służy do negocjowania protokołu połączenia między klientem a serwerem, gdy punkt końcowy obsługuje wiele protokołów. Ta negocjacje określają, czy połączenie korzysta z protokołu HTTP/1.1, czy HTTP/2.
Jeśli punkt końcowy HTTP/2 jest skonfigurowany bez protokołu TLS, ListenOptions.Protocols musi być ustawione na HttpProtocols.Http2
wartość. Punkt końcowy z wieloma protokołami, na HttpProtocols.Http1AndHttp2
przykład, nie może być używany bez protokołu TLS, ponieważ nie ma negocjacji. Wszystkie połączenia z niezabezpieczonym punktem końcowym domyślnie używają protokołu HTTP/1.1, a wywołania gRPC kończą się niepowodzeniem.
Aby uzyskać więcej informacji na temat włączania protokołu HTTP/2 i protokołu TLS za pomocą Kestrel, zobacz Kestrel konfigurację punktu końcowego.
Uwaga
System macOS nie obsługuje ASP.NET Core gRPC z protokołem TLS przed platformą .NET 8. Dodatkowa konfiguracja jest wymagana do pomyślnego uruchomienia usług gRPC w systemie macOS w przypadku korzystania z platformy .NET 7 lub starszej wersji. Aby uzyskać więcej informacji, zobacz Nie można uruchomić aplikacji gRPC platformy ASP.NET Core w systemie macOS.
IIS
Internet Information Services (IIS) to elastyczny, bezpieczny i zarządzany serwer sieci Web do hostowania aplikacji internetowych, w tym ASP.NET Core. Do hostowania usług gRPC przy użyciu usług IIS są wymagane programy .NET 5 i Windows 11 Build 22000 lub Windows Server 2022 Build 20348 lub nowsze.
Usługi IIS muszą być skonfigurowane do używania protokołów TLS i HTTP/2. Aby uzyskać więcej informacji, zobacz Use ASP.NET Core with HTTP/2 on IIS (Używanie ASP.NET Core z protokołem HTTP/2 w usługach IIS).
HTTP.sys
HTTP.sys jest serwerem sieci Web dla platformy ASP.NET Core, który działa tylko w systemie Windows. Platformy .NET 5 i Windows 11 Build 22000 lub Windows Server 2022 Build 20348 lub nowsze są wymagane do hostowania usług gRPC z HTTP.sys.
HTTP.sys należy skonfigurować do używania protokołów TLS i HTTP/2. Aby uzyskać więcej informacji, zobacz obsługę protokołu HTTP/2 przez serwer internetowy HTTP.sys.
Hostowanie usługi gRPC w projektach non-ASP.NET Core
Serwer gRPC platformy ASP.NET Core jest zwykle tworzony na podstawie szablonu gRPC. Plik projektu utworzony przez szablon używa Microsoft.NET.SDK.Web
jako zestawu 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
Wartość zestawu SDK automatycznie dodaje odwołanie do platformy ASP.NET Core. Odwołanie umożliwia aplikacji używanie typów ASP.NET Core wymaganych do hostowania serwera.
Serwer gRPC można dodać do projektów non-ASP.NET Core przy użyciu następujących ustawień pliku 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>
Poprzedni plik projektu:
- Nie używa
Microsoft.NET.SDK.Web
jako zestawu SDK. - Dodaje odwołanie do frameworku do
Microsoft.AspNetCore.App
elementu.- Odwołanie do frameworka umożliwia aplikacjom spoza ASP.NET Core, takim jak usługi systemu Windows, aplikacje WPF lub aplikacje WinForms, korzystanie z interfejsów API ASP.NET Core.
- Aplikacja może teraz używać interfejsów API ASP.NET Core do uruchamiania serwera ASP.NET Core.
- Dodaje wymagania dotyczące korzystania z usługi gRPC:
- Odwołanie do pakietu NuGet
Grpc.AspNetCore
. -
.proto
plik.
- Odwołanie do pakietu NuGet
Aby uzyskać więcej informacji na temat korzystania z dokumentacji frameworka, zobacz Jak korzystać z udostępnionej platformy ASP.NET Core.
Integracja z interfejsami API platformy ASP.NET Core
Usługi gRPC mają pełny dostęp do funkcji ASP.NET Core, takich jak wstrzykiwanie zależności (DI) i logowanie . Na przykład implementacja usługi może rozpoznać usługę rejestratora z kontenera DI.
Wstrzykiwanie konstruktora:
public class GreeterService : Greeter.GreeterBase
{
private readonly ILogger<GreeterService> _logger;
public GreeterService(ILogger<GreeterService> logger)
{
_logger = logger;
}
}
Iniekcja konstruktora podstawowego (.NET 8 lub nowszy):
public class GreeterService(ILogger<GreeterService> logger) : Greeter.GreeterBase
{
...
}
Domyślnie implementacja usługi gRPC może rozpoznawać inne usługi DI o dowolnym cyklu życia (Singleton, Scoped lub Transient).
Rozwiązywanie problemów z protokołem HttpContext w metodach gRPC
Interfejs API gRPC zapewnia dostęp do niektórych danych komunikatów HTTP/2, takich jak metoda, host, nagłówek i przyczepy. Dostęp odbywa się za pośrednictwem argumentu przekazanego ServerCallContext
do każdej metody 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
nie zapewnia pełnego dostępu do HttpContext
wszystkich interfejsów API ASP.NET.
GetHttpContext
Metoda rozszerzenia zapewnia pełny dostęp do reprezentującego HttpContext
podstawowy komunikat HTTP/2 w interfejsach 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
});
}
}
Dodatkowe zasoby
W tym dokumencie pokazano, jak rozpocząć pracę z usługami gRPC przy użyciu ASP.NET Core.
Wymagania wstępne
Program Visual Studio 2022 z pakietem roboczym rozwoju ASP.NET i aplikacji internetowych.
Wprowadzenie do usługi gRPC na platformie ASP.NET Core
Wyświetl lub pobierz przykładowy kod (jak pobrać).
Aby uzyskać szczegółowe instrukcje dotyczące tworzenia projektu gRPC, zobacz Wprowadzenie do usług gRPC.
Dodawanie usługi gRPC do aplikacji ASP.NET Core
Usługa gRPC wymaga pakietu Grpc.AspNetCore.
Konfigurowanie usługi gRPC
W pliku Program.cs
:
- gRPC jest włączone metodą
AddGrpc
. - Każda usługa gRPC jest dodawana do potoku routingu przez metodę
MapGrpcService
.
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();
Jeśli chcesz zobaczyć komentarze kodu przetłumaczone na języki inne niż angielski, poinformuj nas o tym w tym problemie z dyskusją w usłudze GitHub.
Oprogramowanie pośredniczące ASP.NET Core i jego funkcje współużytkują potok routingu, dlatego aplikację można skonfigurować do obsługi dodatkowych żądań. Dodatkowe programy obsługi żądań, takie jak kontrolery MVC, działają równolegle ze skonfigurowanymi usługami gRPC.
Opcje serwera
Usługi gRPC mogą być hostowane przez wszystkie wbudowane serwery ASP.NET Core.
- Kestrel
- TestServer
- IIS
- HTTP.sys†
†Wymaga programu .NET 5 i Windows 11 Build 22000 lub Windows Server 2022 Build 20348 lub nowszego.
Aby uzyskać więcej informacji na temat wybierania odpowiedniego serwera dla aplikacji ASP.NET Core, zobacz Implementacje serwera sieci Web w ASP.NET Core.
Kestrel
Kestrel to międzyplatformowy serwer internetowy dla platformy ASP.NET Core. Kestrel koncentruje się na wysokiej wydajności i wykorzystaniu pamięci, ale nie ma niektórych zaawansowanych funkcji w HTTP.sys, takich jak udostępnianie portów.
Kestrel Punkty końcowe gRPC:
- Wymagaj protokołu HTTP/2.
- Należy zabezpieczyć przy użyciu protokołu Transport Layer Security (TLS).
HTTP/2
GRPC wymaga protokołu HTTP/2. gRPC dla ASP.NET Core sprawdza, czy HttpRequest.Protocol jest HTTP/2
.
Kestrel obsługuje protokół HTTP/2 w większości nowoczesnych systemów operacyjnych. Kestrel Punkty końcowe są domyślnie skonfigurowane do obsługi połączeń HTTP/1.1 i HTTP/2.
TLS
Kestrel punkty końcowe używane na potrzeby gRPC powinny być zabezpieczone przy użyciu protokołu TLS. W trakcie tworzenia automatycznie tworzony jest punkt dostępowy zabezpieczony przy użyciu protokołu TLS w https://localhost:5001
, w przypadku obecności certyfikatu deweloperskiego ASP.NET Core. Nie jest wymagana żadna konfiguracja. Prefiks https
sprawdza, Kestrel czy punkt końcowy używa protokołu TLS.
W środowisku produkcyjnym protokół TLS musi być jawnie skonfigurowany. W poniższym appsettings.json
przykładzie podano punkt końcowy HTTP/2 zabezpieczony przy użyciu protokołu TLS:
{
"Kestrel": {
"Endpoints": {
"HttpsInlineCertFile": {
"Url": "https://localhost:5001",
"Protocols": "Http2",
"Certificate": {
"Path": "<path to .pfx file>",
"Password": "<certificate password>"
}
}
}
}
}
Alternatywnie, końcowe punkty Kestrel można skonfigurować w 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>");
});
});
Aby uzyskać więcej informacji na temat włączania protokołu TLS za pomocą Kestrel, zobacz Kestrel Konfigurację punktu końcowego HTTPS.
Negocjowanie protokołu
Protokół TLS jest używany nie tylko do zabezpieczania komunikacji. Uzgadnianie negocjacji protokołu TLS w warstwie aplikacji (ALPN) służy do negocjowania protokołu połączenia między klientem a serwerem, gdy punkt końcowy obsługuje wiele protokołów. Ta negocjacje określają, czy połączenie korzysta z protokołu HTTP/1.1, czy HTTP/2.
Jeśli punkt końcowy HTTP/2 jest skonfigurowany bez protokołu TLS, ListenOptions.Protocols musi być ustawiony na HttpProtocols.Http2
. Punkt końcowy z wieloma protokołami, na HttpProtocols.Http1AndHttp2
przykład, nie może być używany bez protokołu TLS, ponieważ nie ma negocjacji. Wszystkie połączenia z niezabezpieczonym punktem końcowym są domyślnie ustawiane na HTTP/1.1, a wywołania gRPC kończą się niepowodzeniem.
Aby uzyskać więcej informacji na temat włączania protokołu HTTP/2 i TLS z Kestrel, zobacz Kestrel konfigurację punktu końcowego.
Uwaga
System macOS nie obsługuje ASP.NET Core gRPC z protokołem TLS przed platformą .NET 8. Dodatkowa konfiguracja jest wymagana do pomyślnego uruchomienia usług gRPC w systemie macOS w przypadku korzystania z platformy .NET 7 lub starszej wersji. Aby uzyskać więcej informacji, zobacz Nie można uruchomić aplikacji gRPC platformy ASP.NET Core w systemie macOS.
IIS
Internet Information Services (IIS) to elastyczny, bezpieczny i zarządzany serwer sieci Web do hostowania aplikacji internetowych, w tym ASP.NET Core. Do hostowania usług gRPC przy użyciu usług IIS są wymagane programy .NET 5 i Windows 11 Build 22000 lub Windows Server 2022 Build 20348 lub nowsze.
Usługi IIS muszą być skonfigurowane do używania protokołów TLS i HTTP/2. Aby uzyskać więcej informacji, zobacz Use ASP.NET Core with HTTP/2 on IIS (Używanie ASP.NET Core z protokołem HTTP/2 w usługach IIS).
HTTP.sys
HTTP.sys jest serwerem sieci Web dla platformy ASP.NET Core, który działa tylko w systemie Windows. Platformy .NET 5 i Windows 11 Build 22000 lub Windows Server 2022 Build 20348 lub nowsze są wymagane do hostowania usług gRPC z HTTP.sys.
HTTP.sys należy skonfigurować do używania protokołów TLS i HTTP/2. Aby uzyskać więcej informacji, zobacz HTTP.sys obsługę protokołu HTTP/2 serwera internetowego.
Hostowanie usługi gRPC w projektach non-ASP.NET Core
Serwer gRPC platformy ASP.NET Core jest zwykle tworzony na podstawie szablonu gRPC. Plik projektu utworzony przez szablon używa Microsoft.NET.SDK.Web
jako 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
Wartość zestawu SDK automatycznie dodaje odwołanie do platformy ASP.NET Core. Odwołanie pozwala aplikacji na wykorzystanie typów ASP.NET Core wymaganych do hostowania serwera.
Serwer gRPC można dodać do projektów non-ASP.NET Core przy użyciu następujących ustawień pliku 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>
Poprzedni plik projektu:
- Nie używa
Microsoft.NET.SDK.Web
jako zestawu SDK. - Dodaje odwołanie do frameworka do
Microsoft.AspNetCore.App
.- Odwołanie do platformy umożliwia aplikacjom spoza ASP.NET Core, takim jak usługi systemu Windows, aplikacje WPF lub aplikacje WinForms, korzystanie z interfejsów API ASP.NET Core.
- Aplikacja może teraz używać interfejsów API ASP.NET Core do uruchamiania serwera ASP.NET Core.
- Dodaje wymagania gRPC:
- Odwołanie do pakietu NuGet
Grpc.AspNetCore
. -
.proto
plik.
- Odwołanie do pakietu NuGet
Aby uzyskać więcej informacji na temat korzystania z dokumentacji platformy, zobacz Microsoft.AspNetCore.App
Korzystanie z platformy udostępnionej ASP.NET Core.
Integracja z interfejsami API platformy ASP.NET Core
Usługi gRPC mają pełny dostęp do funkcji ASP.NET Core, takich jak wstrzykiwanie zależności (DI) i logowanie. Na przykład implementacja usługi może rozpoznać usługę rejestratora z kontenera DI za pomocą konstruktora:
public class GreeterService : Greeter.GreeterBase
{
public GreeterService(ILogger<GreeterService> logger)
{
}
}
Domyślnie implementacja usługi gRPC może rozwiązywać inne usługi DI o dowolnym czasie życia (Singleton, Scoped lub Przejściowy).
Rozwiązywanie problemów z protokołem HttpContext w metodach gRPC
Interfejs API gRPC zapewnia dostęp do niektórych danych komunikatów HTTP/2, takich jak metoda, host, nagłówki i trailery. Dostęp odbywa się za pośrednictwem argumentu przekazanego ServerCallContext
do każdej metody 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
nie zapewnia pełnego dostępu do HttpContext
wszystkich interfejsów API ASP.NET.
GetHttpContext
Metoda rozszerzeń zapewnia pełny dostęp do obiektu reprezentującego podstawowy komunikat HTTP/2 w interfejsach 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
});
}
}
Dodatkowe zasoby
W tym dokumencie pokazano, jak rozpocząć pracę z usługami gRPC przy użyciu ASP.NET Core.
Wymagania wstępne
- Program Visual Studio 2022 z pakietem roboczym tworzenia aplikacji ASP.NET i aplikacji internetowych.
- Zestaw SDK dla platformy .NET 6.0
Wprowadzenie do usługi gRPC na platformie ASP.NET Core
Wyświetl lub pobierz przykładowy kod (jak pobrać).
Aby uzyskać szczegółowe instrukcje dotyczące tworzenia projektu gRPC, zobacz Wprowadzenie do usług gRPC.
Dodawanie usługi gRPC do aplikacji ASP.NET Core
Usługa gRPC wymaga pakietu Grpc.AspNetCore.
Konfigurowanie usługi gRPC
W pliku Program.cs
:
- gRPC jest włączona za pomocą metody
AddGrpc
. - Każda usługa gRPC jest dodawana do potoku routingu za pośrednictwem metody
MapGrpcService
.
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();
Jeśli chcesz zobaczyć komentarze kodu przetłumaczone na języki inne niż angielski, poinformuj nas o tym w tym problemie z dyskusją w usłudze GitHub.
ASP.NET Core middleware i funkcje współdzielą potok routingu, dlatego aplikację można skonfigurować do obsługi dodatkowych żądań. Dodatkowe programy obsługi żądań, takie jak kontrolery MVC, działają równolegle ze skonfigurowanymi usługami gRPC.
Opcje serwera
Usługi gRPC mogą być hostowane przez wszystkie wbudowane serwery ASP.NET Core.
- Kestrel
- TestServer
- IIS
- HTTP.sys†
†Wymaga programu .NET 5 i Windows 11 Build 22000 lub Windows Server 2022 Build 20348 lub nowszego.
Aby uzyskać więcej informacji na temat wybierania odpowiedniego serwera dla aplikacji ASP.NET Core, zobacz Implementacje serwera sieci Web w ASP.NET Core.
Kestrel
Kestrel to międzyplatformowy serwer internetowy dla platformy ASP.NET Core. Kestrel koncentruje się na wysokiej wydajności i wykorzystaniu pamięci, ale nie ma niektórych zaawansowanych funkcji w HTTP.sys, takich jak udostępnianie portów.
Kestrel Punkty końcowe gRPC:
- Wymagaj protokołu HTTP/2.
- Należy zabezpieczyć przy użyciu protokołu Transport Layer Security (TLS).
HTTP/2
GRPC wymaga protokołu HTTP/2. gRPC dla ASP.NET Core sprawdza, czy protokół HttpRequest.Protocol to HTTP/2
.
Kestrel obsługuje protokół HTTP/2 w większości nowoczesnych systemów operacyjnych. Kestrel Punkty końcowe są domyślnie skonfigurowane do obsługi połączeń HTTP/1.1 i HTTP/2.
TLS
Kestrel punkty końcowe używane na potrzeby gRPC powinny być zabezpieczone przy użyciu protokołu TLS. Podczas opracowywania punkt końcowy zabezpieczony przy użyciu protokołu TLS jest tworzony automatycznie w https://localhost:5001
kiedy obecny jest certyfikat deweloperski ASP.NET Core. Nie jest wymagana żadna konfiguracja. Prefiks https
sprawdza, Kestrel czy punkt końcowy używa protokołu TLS.
W środowisku produkcyjnym protokół TLS musi być jawnie skonfigurowany. W poniższym appsettings.json
przykładzie podano punkt końcowy HTTP/2 zabezpieczony przy użyciu protokołu TLS:
{
"Kestrel": {
"Endpoints": {
"HttpsInlineCertFile": {
"Url": "https://localhost:5001",
"Protocols": "Http2",
"Certificate": {
"Path": "<path to .pfx file>",
"Password": "<certificate password>"
}
}
}
}
}
Alternatywnie Kestrel punkty końcowe można skonfigurować w 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>");
});
});
Aby uzyskać więcej informacji na temat włączania protokołu TLS za pomocą Kestrelprogramu , zobacz Kestrel Konfiguracja punktu końcowego HTTPS.
Negocjowanie protokołu
Protokół TLS jest używany nie tylko do zabezpieczania komunikacji. Uzgadnianie negocjacji protokołu TLS w warstwie aplikacji (ALPN) służy do negocjowania protokołu połączenia między klientem a serwerem, gdy punkt końcowy obsługuje wiele protokołów. Ta negocjacje określają, czy połączenie korzysta z protokołu HTTP/1.1, czy HTTP/2.
Jeśli punkt końcowy HTTP/2 jest skonfigurowany bez protokołu TLS, opcja ListenOptions.Protocols musi być ustawiona na HttpProtocols.Http2
. Punkt końcowy z wieloma protokołami, na HttpProtocols.Http1AndHttp2
przykład, nie może być używany bez protokołu TLS, ponieważ nie ma negocjacji. Wszystkie połączenia z niezabezpieczonym punktem końcowym domyślnie używają HTTP/1.1, a wywołania gRPC kończą się niepowodzeniem.
Aby uzyskać więcej informacji na temat włączania protokołu HTTP/2 i TLS za pomocą Kestrel, sprawdź Kestrel konfigurację punktu końcowego.
Uwaga
System macOS nie obsługuje ASP.NET Core gRPC z protokołem TLS przed platformą .NET 8. Dodatkowa konfiguracja jest wymagana do pomyślnego uruchomienia usług gRPC w systemie macOS w przypadku korzystania z platformy .NET 7 lub starszej wersji. Aby uzyskać więcej informacji, zobacz Nie można uruchomić aplikacji gRPC platformy ASP.NET Core w systemie macOS.
IIS
Internet Information Services (IIS) to elastyczny, bezpieczny i zarządzany serwer sieci Web do hostowania aplikacji internetowych, w tym ASP.NET Core. Do hostowania usług gRPC przy użyciu usług IIS są wymagane programy .NET 5 i Windows 11 Build 22000 lub Windows Server 2022 Build 20348 lub nowsze.
Usługi IIS muszą być skonfigurowane do używania protokołów TLS i HTTP/2. Aby uzyskać więcej informacji, zobacz Use ASP.NET Core with HTTP/2 on IIS (Używanie ASP.NET Core z protokołem HTTP/2 w usługach IIS).
HTTP.sys
HTTP.sys jest serwerem sieci Web dla platformy ASP.NET Core, który działa tylko w systemie Windows. Platformy .NET 5 i Windows 11 Build 22000 lub Windows Server 2022 Build 20348 lub nowsze są wymagane do hostowania usług gRPC z HTTP.sys.
HTTP.sys należy skonfigurować do używania protokołów TLS i HTTP/2. Aby uzyskać więcej informacji, zobacz obsługę protokołu HTTP/2 przez serwer internetowy HTTP.sys.
Hostowanie usługi gRPC w projektach non-ASP.NET Core
Serwer gRPC platformy ASP.NET Core jest zwykle tworzony na podstawie szablonu gRPC. Plik projektu utworzony przez szablon używa Microsoft.NET.SDK.Web
jako 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
Wartość zestawu SDK automatycznie dodaje odwołanie do platformy ASP.NET Core. Odwołanie umożliwia aplikacji używanie typów ASP.NET Core wymaganych do hostowania serwera.
Serwer gRPC można dodać do projektów non-ASP.NET Core przy użyciu następujących ustawień pliku 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>
Poprzedni plik projektu:
- Nie używa
Microsoft.NET.SDK.Web
jako zestawu SDK. - Dodaje odwołanie do frameworka do
Microsoft.AspNetCore.App
.- pl-PL: Referencja frameworka umożliwia aplikacjom nieopartym na ASP.NET Core, takim jak usługi systemu Windows, aplikacje WPF lub aplikacje WinForms, korzystanie z interfejsów API ASP.NET Core.
- Aplikacja może teraz używać interfejsów API ASP.NET Core do uruchamiania serwera ASP.NET Core.
- Dodaje wymagania dotyczące usługi gRPC:
- Odwołanie do pakietu NuGet dla
Grpc.AspNetCore
elementu. -
.proto
plik.
- Odwołanie do pakietu NuGet dla
pl-PL: Aby uzyskać więcej informacji na temat korzystania z odwołania do platformy Microsoft.AspNetCore.App
, zobacz Korzystanie z udostępnionej platformy ASP.NET Core.
Integracja z interfejsami API platformy ASP.NET Core
Usługi gRPC mają pełny dostęp do funkcji ASP.NET Core, takich jak iniekcja zależności (DI) i logowanie. Na przykład implementacja usługi może rozpoznać usługę rejestratora z kontenera DI za pomocą konstruktora:
public class GreeterService : Greeter.GreeterBase
{
public GreeterService(ILogger<GreeterService> logger)
{
}
}
Domyślnie implementacja usługi gRPC może rozpoznawać inne usługi DI o dowolnym czasie życia (Singleton, Scoped lub Przejściowy).
Rozwiązywanie problemów z protokołem HttpContext w metodach gRPC
Interfejs API gRPC zapewnia dostęp do niektórych danych komunikatów HTTP/2, takich jak metoda, host, nagłówek i trailery. Dostęp odbywa się za pośrednictwem argumentu przekazanego ServerCallContext
do każdej metody 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
nie zapewnia pełnego dostępu do HttpContext
wszystkich interfejsów API ASP.NET. Metoda rozszerzenia GetHttpContext
zapewnia pełny dostęp do HttpContext
, który reprezentuje podstawowy komunikat HTTP/2 w interfejsach 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
});
}
}
Dodatkowe zasoby
W tym dokumencie pokazano, jak rozpocząć pracę z usługami gRPC przy użyciu ASP.NET Core.
Wymagania wstępne
- Program Visual Studio 2019 16.8 lub nowsza wersja z pakietem roboczym tworzenia aplikacji ASP.NET. i aplikacji internetowych
- .NET 5.0 SDK
Wprowadzenie do usługi gRPC na platformie ASP.NET Core
Wyświetl lub pobierz przykładowy kod (jak pobrać).
Aby uzyskać szczegółowe instrukcje dotyczące tworzenia projektu gRPC, zobacz Wprowadzenie do usług gRPC.
Dodawanie usługi gRPC do aplikacji ASP.NET Core
Usługa gRPC wymaga pakietu Grpc.AspNetCore.
Konfigurowanie usługi gRPC
W pliku Startup.cs
:
- gRPC jest włączona za pomocą metody
AddGrpc
. - Każda usługa gRPC jest dodawana do potoku routingu za pomocą metody
MapGrpcService
.
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>();
});
}
}
Jeśli chcesz zobaczyć komentarze kodu przetłumaczone na języki inne niż angielski, poinformuj nas o tym w tym problemie z dyskusją w usłudze GitHub.
ASP.NET Core oprogramowanie pośredniczące i funkcje dzielą potok routingu, dlatego można skonfigurować aplikację do obsługi dodatkowych żądań. Dodatkowe programy obsługi żądań, takie jak kontrolery MVC, działają równolegle ze skonfigurowanymi usługami gRPC.
Opcje serwera
Usługi gRPC mogą być hostowane przez wszystkie wbudowane serwery ASP.NET Core.
- Kestrel
- TestServer
- IIS
- HTTP.sys†
†Wymaga programu .NET 5 i Windows 11 Build 22000 lub Windows Server 2022 Build 20348 lub nowszego.
Aby uzyskać więcej informacji na temat wybierania odpowiedniego serwera dla aplikacji ASP.NET Core, zobacz Implementacje serwera sieci Web w ASP.NET Core.
Kestrel
Kestrel to międzyplatformowy serwer internetowy dla platformy ASP.NET Core. Kestrel koncentruje się na wysokiej wydajności i wykorzystaniu pamięci, ale nie ma niektórych zaawansowanych funkcji w HTTP.sys, takich jak udostępnianie portów.
Kestrel Punkty końcowe gRPC:
- Wymagaj protokołu HTTP/2.
- Należy zabezpieczyć przy użyciu protokołu Transport Layer Security (TLS).
HTTP/2
GRPC wymaga protokołu HTTP/2. gRPC dla ASP.NET Core sprawdza, czy protokół HttpRequest.Protocol to HTTP/2
.
Kestrel obsługuje protokół HTTP/2 w większości nowoczesnych systemów operacyjnych. Kestrel Punkty końcowe są domyślnie skonfigurowane do obsługi połączeń HTTP/1.1 i HTTP/2.
TLS
Kestrel punkty końcowe używane na potrzeby gRPC powinny być zabezpieczone przy użyciu protokołu TLS. W trakcie rozwoju, gdy jest obecny certyfikat dewelopera ASP.NET Core, punkt końcowy zabezpieczony przy użyciu protokołu TLS jest automatycznie tworzony pod https://localhost:5001
. Nie jest wymagana żadna konfiguracja. Prefiks https
sprawdza, Kestrel czy punkt końcowy używa protokołu TLS.
W środowisku produkcyjnym protokół TLS musi być jawnie skonfigurowany. W poniższym appsettings.json
przykładzie podano punkt końcowy HTTP/2 zabezpieczony przy użyciu protokołu TLS:
{
"Kestrel": {
"Endpoints": {
"HttpsInlineCertFile": {
"Url": "https://localhost:5001",
"Protocols": "Http2",
"Certificate": {
"Path": "<path to .pfx file>",
"Password": "<certificate password>"
}
}
}
}
}
Alternatywnie, punkty końcowe Kestrel można skonfigurować w programie 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>();
});
Aby uzyskać więcej informacji na temat włączania protokołu TLS za pomocą Kestrel, zobacz Kestrel konfigurację punktu końcowego HTTPS.
Negocjowanie protokołu
Protokół TLS jest używany do czegoś więcej niż tylko do zabezpieczania komunikacji. Negocjacja Protokołu Warstwy Aplikacji (ALPN) w ramach TLS służy do uzgadniania protokołu połączenia między klientem a serwerem, gdy punkt końcowy obsługuje wiele protokołów. Ta negocjacje określają, czy połączenie korzysta z protokołu HTTP/1.1, czy HTTP/2.
Jeśli punkt końcowy HTTP/2 jest skonfigurowany bez protokołu TLS, opcja ListenOptions.Protocols punktu końcowego musi być ustawiona na HttpProtocols.Http2
. Punkt końcowy z wieloma protokołami, na HttpProtocols.Http1AndHttp2
przykład, nie może być używany bez protokołu TLS, ponieważ nie ma negocjacji. Wszystkie połączenia z niezabezpieczonym punktem końcowym są domyślnie ustawione na HTTP/1.1, a wywołania gRPC kończą się niepowodzeniem.
Aby uzyskać więcej informacji na temat włączania protokołu HTTP/2 i TLS za pomocą Kestrel, zobacz konfigurację punktu końcowego Kestrel.
Uwaga
System macOS nie obsługuje ASP.NET Core gRPC z protokołem TLS przed platformą .NET 8. Dodatkowa konfiguracja jest wymagana do pomyślnego uruchomienia usług gRPC w systemie macOS w przypadku korzystania z platformy .NET 7 lub starszej wersji. Aby uzyskać więcej informacji, zobacz Nie można uruchomić aplikacji gRPC platformy ASP.NET Core w systemie macOS.
IIS
Internet Information Services (IIS) to elastyczny, bezpieczny i zarządzany serwer sieci Web do hostowania aplikacji internetowych, w tym ASP.NET Core. Do hostowania usług gRPC przy użyciu usług IIS są wymagane programy .NET 5 i Windows 11 Build 22000 lub Windows Server 2022 Build 20348 lub nowsze.
Usługi IIS muszą być skonfigurowane do używania protokołów TLS i HTTP/2. Aby uzyskać więcej informacji, zobacz Use ASP.NET Core with HTTP/2 on IIS (Używanie ASP.NET Core z protokołem HTTP/2 w usługach IIS).
HTTP.sys
HTTP.sys jest serwerem sieci Web dla platformy ASP.NET Core, który działa tylko w systemie Windows. Platformy .NET 5 i Windows 11 Build 22000 lub Windows Server 2022 Build 20348 lub nowsze są wymagane do hostowania usług gRPC z HTTP.sys.
HTTP.sys należy skonfigurować do używania protokołów TLS i HTTP/2. Aby uzyskać więcej informacji, zobacz obsługę HTTP/2 serwera WWW HTTP.sys.
Hostowanie usługi gRPC w projektach non-ASP.NET Core
Serwer gRPC platformy ASP.NET Core jest zwykle tworzony na podstawie szablonu gRPC. Plik projektu utworzony przez szablon używa Microsoft.NET.SDK.Web
jako 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
Wartość zestawu SDK automatycznie dodaje odwołanie do platformy ASP.NET Core. Odwołanie pozwala aplikacji na używanie typów ASP.NET Core wymaganych do hostowania serwera.
Serwer gRPC można dodać do projektów non-ASP.NET Core przy użyciu następujących ustawień pliku 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>
Poprzedni plik projektu:
- Nie używa
Microsoft.NET.SDK.Web
jako zestawu SDK. - Dodaje odwołanie do frameworku
Microsoft.AspNetCore.App
.- Odwołanie do platformy umożliwia aplikacjom non-ASP.NET Core, takim jak usługi systemu Windows, aplikacje WPF czy WinForms, korzystanie z interfejsów API ASP.NET Core.
- Aplikacja może teraz używać interfejsów API ASP.NET Core do uruchamiania serwera ASP.NET Core.
- Dodaje wymagania dotyczące usługi gRPC:
- Odwołanie do pakietu NuGet
Grpc.AspNetCore
. -
.proto
plik.
- Odwołanie do pakietu NuGet
Aby uzyskać więcej informacji na temat korzystania z odniesienia do platformy, zobacz
Integracja z interfejsami API platformy ASP.NET Core
Usługi gRPC mają pełny dostęp do funkcji ASP.NET Core, takich jak wstrzykiwanie zależności (DI) i logowanie. Na przykład implementacja usługi może rozpoznać usługę rejestratora z kontenera DI za pomocą konstruktora:
public class GreeterService : Greeter.GreeterBase
{
public GreeterService(ILogger<GreeterService> logger)
{
}
}
Domyślnie implementacja usługi gRPC może rozpoznawać inne usługi DI o dowolnym czasie życia (Singleton, Scoped lub Przejściowy).
Rozwiązywanie problemów z protokołem HttpContext w metodach gRPC
Interfejs API gRPC zapewnia dostęp do niektórych danych komunikatów HTTP/2, takich jak metoda, host, nagłówki i trailery. Dostęp odbywa się za pośrednictwem argumentu przekazanego ServerCallContext
do każdej metody 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
nie zapewnia pełnego dostępu do HttpContext
wszystkich interfejsów API ASP.NET. Metoda rozszerzenia GetHttpContext
zapewnia pełny dostęp do HttpContext
reprezentującego podstawowy komunikat HTTP/2 w interfejsach 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
});
}
}
Dodatkowe zasoby
W tym dokumencie pokazano, jak rozpocząć pracę z usługami gRPC przy użyciu ASP.NET Core.
Wymagania wstępne
- Program Visual Studio 2019 16.4 lub nowsza wersja z pakietem roboczym tworzenia aplikacji ASP.NET i aplikacji internetowych
- .NET Core 3.1 SDK
Wprowadzenie do usługi gRPC na platformie ASP.NET Core
Wyświetl lub pobierz przykładowy kod (jak pobrać).
Aby uzyskać szczegółowe instrukcje dotyczące tworzenia projektu gRPC, zobacz Wprowadzenie do usług gRPC.
Dodawanie usługi gRPC do aplikacji ASP.NET Core
Usługa gRPC wymaga pakietu Grpc.AspNetCore.
Konfigurowanie usługi gRPC
W pliku Startup.cs
:
- gRPC jest włączony za pomocą metody
AddGrpc
. - Każda usługa gRPC jest dodawana do potoku routingu za pośrednictwem metody
MapGrpcService
.
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>();
});
}
}
Jeśli chcesz zobaczyć komentarze kodu przetłumaczone na języki inne niż angielski, poinformuj nas o tym w tym problemie z dyskusją w usłudze GitHub.
ASP.NET Core middleware i funkcje współużytkują potok routingu, dlatego aplikację można skonfigurować do obsługi dodatkowych obsług żądań. Dodatkowe programy obsługi żądań, takie jak kontrolery MVC, działają równolegle ze skonfigurowanymi usługami gRPC.
Opcje serwera
Usługi gRPC mogą być hostowane przez wszystkie wbudowane serwery ASP.NET Core.
- Kestrel
- SerwerTestowy
- IIS
- HTTP.sys†
†Wymaga programu .NET 5 i Windows 11 Build 22000 lub Windows Server 2022 Build 20348 lub nowszego.
Aby uzyskać więcej informacji na temat wybierania odpowiedniego serwera dla aplikacji ASP.NET Core, zobacz Implementacje serwera sieci Web w ASP.NET Core.
Kestrel
Kestrel to międzyplatformowy serwer internetowy dla platformy ASP.NET Core. Kestrel koncentruje się na wysokiej wydajności i wykorzystaniu pamięci, ale nie ma niektórych zaawansowanych funkcji w HTTP.sys, takich jak udostępnianie portów.
Kestrel Punkty końcowe gRPC:
- Wymagaj protokołu HTTP/2.
- Należy zabezpieczyć przy użyciu protokołu Transport Layer Security (TLS).
HTTP/2
GRPC wymaga protokołu HTTP/2. gRPC dla ASP.NET Core sprawdza, czy HttpRequest.Protocol jest równy HTTP/2
.
Kestrel obsługuje protokół HTTP/2 w większości nowoczesnych systemów operacyjnych. Kestrel Punkty końcowe są domyślnie skonfigurowane do obsługi połączeń HTTP/1.1 i HTTP/2.
TLS
Kestrel punkty końcowe używane na potrzeby gRPC powinny być zabezpieczone przy użyciu protokołu TLS. W trakcie tworzenia punkt końcowy zabezpieczony protokołem TLS jest automatycznie tworzony w https://localhost:5001
, gdy obecny jest certyfikat deweloperski ASP.NET Core. Nie jest wymagana żadna konfiguracja. Prefiks https
sprawdza, Kestrel czy punkt końcowy używa protokołu TLS.
W środowisku produkcyjnym protokół TLS musi być jawnie skonfigurowany. W poniższym appsettings.json
przykładzie podano punkt końcowy HTTP/2 zabezpieczony przy użyciu protokołu TLS:
{
"Kestrel": {
"Endpoints": {
"HttpsInlineCertFile": {
"Url": "https://localhost:5001",
"Protocols": "Http2",
"Certificate": {
"Path": "<path to .pfx file>",
"Password": "<certificate password>"
}
}
}
}
}
Alternatywnie Kestrel punkty końcowe można skonfigurować w 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>();
});
Aby uzyskać więcej informacji na temat włączania protokołu TLS za pomocą Kestrel, zapoznaj się z KestrelKonfiguracją punktu końcowego HTTPS.
Negocjowanie protokołu
Protokół TLS jest używany do więcej celów niż tylko zabezpieczanie komunikacji. Uzgadnianie negocjacji protokołu TLS w warstwie aplikacji (ALPN) służy do negocjowania protokołu połączenia między klientem a serwerem, gdy punkt końcowy obsługuje wiele protokołów. Ta negocjacje określają, czy połączenie korzysta z protokołu HTTP/1.1, czy HTTP/2.
Jeśli punkt końcowy HTTP/2 jest skonfigurowany bez protokołu TLS, ListenOptions.Protocols musi być ustawiony na HttpProtocols.Http2
. Punkt końcowy z wieloma protokołami, na HttpProtocols.Http1AndHttp2
przykład, nie może być używany bez protokołu TLS, ponieważ nie ma negocjacji. Wszystkie połączenia z niezabezpieczonym punktem końcowym domyślnie używają protokołu HTTP/1.1, a wywołania gRPC kończą się niepowodzeniem.
Aby uzyskać więcej informacji na temat włączania protokołu HTTP/2 i TLS za pomocą Kestrel, zobacz konfigurację punktu końcowego Kestrel.
Uwaga
System macOS nie obsługuje ASP.NET Core gRPC z protokołem TLS przed platformą .NET 8. Dodatkowa konfiguracja jest wymagana do pomyślnego uruchomienia usług gRPC w systemie macOS w przypadku korzystania z platformy .NET 7 lub starszej wersji. Aby uzyskać więcej informacji, zobacz Nie można uruchomić aplikacji gRPC platformy ASP.NET Core w systemie macOS.
Hostowanie usługi gRPC w projektach non-ASP.NET Core
Serwer gRPC platformy ASP.NET Core jest zwykle tworzony na podstawie szablonu gRPC. Plik projektu utworzony przez szablon używa Microsoft.NET.SDK.Web
jako 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
Wartość zestawu SDK automatycznie dodaje odwołanie do platformy ASP.NET Core. Odwołanie pozwala aplikacji na używanie typów ASP.NET Core wymaganych do hostowania serwera.
Serwer gRPC można dodać do projektów non-ASP.NET Core przy użyciu następujących ustawień pliku 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>
Poprzedni plik projektu:
- Nie używa
Microsoft.NET.SDK.Web
jako zestawu SDK. - Dodaje odwołanie do struktury
Microsoft.AspNetCore.App
.- Odwołanie do struktury umożliwia aplikacjom spoza ASP.NET Core, takim jak usługi systemu Windows, aplikacje WPF lub aplikacje WinForms, korzystanie z interfejsów API ASP.NET Core.
- Aplikacja może teraz używać interfejsów API ASP.NET Core do uruchamiania serwera ASP.NET Core.
- Dodaje wymagania dotyczące usługi gRPC:
- Odwołanie do pakietu NuGet
Grpc.AspNetCore
. -
.proto
plik.
- Odwołanie do pakietu NuGet
Aby uzyskać więcej informacji na temat korzystania z dokumentacji platformy, zobacz Microsoft.AspNetCore.App
(Korzystanie z platformy udostępnionej ASP.NET Core).
Integracja z interfejsami API platformy ASP.NET Core
Usługi gRPC mają pełny dostęp do takich funkcji ASP.NET Core jak wstrzykiwanie zależności (DI) i logowanie. Na przykład implementacja usługi może rozpoznać usługę rejestratora z kontenera DI za pomocą konstruktora:
public class GreeterService : Greeter.GreeterBase
{
public GreeterService(ILogger<GreeterService> logger)
{
}
}
Domyślnie implementacja usługi gRPC może rozpoznawać inne usługi DI z dowolnym cyklem życia (Singleton, Scoped lub Przejściowy).
Rozwiązywanie problemów z protokołem HttpContext w metodach gRPC
Interfejs API gRPC zapewnia dostęp do niektórych danych komunikatów HTTP/2, takich jak metoda, host, nagłówek i przyrostki. Dostęp odbywa się za pośrednictwem argumentu przekazanego ServerCallContext
do każdej metody 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
nie zapewnia pełnego dostępu do HttpContext
wszystkich interfejsów API ASP.NET. Metoda rozszerzająca GetHttpContext
zapewnia pełny dostęp do HttpContext
reprezentującego bazowy komunikat HTTP/2 w 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
});
}
}
Dodatkowe zasoby
W tym dokumencie pokazano, jak rozpocząć pracę z usługami gRPC przy użyciu ASP.NET Core.
Wymagania wstępne
- Visual Studio 2019 z pakietem roboczym ASP.NET i tworzenia aplikacji internetowych
- Zestaw SDK platformy .NET Core 3.0
Wprowadzenie do usługi gRPC na platformie ASP.NET Core
Wyświetl lub pobierz przykładowy kod (jak pobrać).
Aby uzyskać szczegółowe instrukcje dotyczące tworzenia projektu gRPC, zobacz Wprowadzenie do usług gRPC.
Dodawanie usługi gRPC do aplikacji ASP.NET Core
Usługa gRPC wymaga pakietu Grpc.AspNetCore.
Konfigurowanie usługi gRPC
W pliku Startup.cs
:
- gRPC jest włączony za pomocą metody
AddGrpc
. - Każda usługa gRPC jest dodawana do potoku routingu za pomocą metody
MapGrpcService
.
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>();
});
}
}
Jeśli chcesz zobaczyć komentarze kodu przetłumaczone na języki inne niż angielski, poinformuj nas o tym w tym problemie z dyskusją w usłudze GitHub.
ASP.NET Podstawowe oprogramowanie pośredniczące i funkcje współużytkują potok routingu, dlatego można skonfigurować aplikację do obsługi dodatkowych procedur obsługi żądań. Dodatkowe programy obsługi żądań, takie jak kontrolery MVC, działają równolegle ze skonfigurowanymi usługami gRPC.
Opcje serwera
Usługi gRPC mogą być hostowane przez wszystkie wbudowane serwery ASP.NET Core.
- Kestrel
- Serwer testowy
- Usługi IIS
- HTTP.sys†
†Wymaga programu .NET 5 i Windows 11 Build 22000 lub Windows Server 2022 Build 20348 lub nowszego.
Aby uzyskać więcej informacji na temat wybierania odpowiedniego serwera dla aplikacji ASP.NET Core, zobacz Implementacje serwera sieci Web w ASP.NET Core.
Kestrel
Kestrel to międzyplatformowy serwer internetowy dla platformy ASP.NET Core. Kestrel koncentruje się na wysokiej wydajności i wykorzystaniu pamięci, ale nie ma niektórych zaawansowanych funkcji w HTTP.sys, takich jak udostępnianie portów.
Kestrel Punkty końcowe gRPC:
- Wymagaj protokołu HTTP/2.
- Należy zabezpieczyć przy użyciu protokołu Transport Layer Security (TLS).
HTTP/2
GRPC wymaga protokołu HTTP/2. gRPC dla ASP.NET Core sprawdza, czy HttpRequest.Protocol jest zgodny z HTTP/2
.
Kestrel obsługuje protokół HTTP/2 w większości nowoczesnych systemów operacyjnych. Kestrel Punkty końcowe są domyślnie skonfigurowane do obsługi połączeń HTTP/1.1 i HTTP/2.
TLS
Kestrel punkty końcowe używane na potrzeby gRPC powinny być zabezpieczone przy użyciu protokołu TLS. Podczas opracowywania, punkt końcowy zabezpieczony protokołem TLS jest tworzony automatycznie na https://localhost:5001
, gdy jest obecny certyfikat dewelopera ASP.NET Core. Nie jest wymagana żadna konfiguracja. Prefiks https
sprawdza, Kestrel czy punkt końcowy używa protokołu TLS.
W środowisku produkcyjnym protokół TLS musi być jawnie skonfigurowany. W poniższym appsettings.json
przykładzie podano punkt końcowy HTTP/2 zabezpieczony przy użyciu protokołu TLS:
{
"Kestrel": {
"Endpoints": {
"HttpsInlineCertFile": {
"Url": "https://localhost:5001",
"Protocols": "Http2",
"Certificate": {
"Path": "<path to .pfx file>",
"Password": "<certificate password>"
}
}
}
}
}
Alternatywnie Kestrel punkty końcowe można skonfigurować w programie 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>();
});
Aby uzyskać więcej informacji na temat włączania protokołu TLS z Kestrel, zobacz Kestrel konfigurację punktu końcowego HTTPS.
Negocjowanie protokołu
Protokół TLS jest używany do czegoś więcej niż tylko zabezpieczania komunikacji. Protokół uzgadniania w warstwie aplikacji TLS (ALPN) jest używany do ustalania protokołu połączenia między klientem a serwerem, gdy punkt końcowy obsługuje wiele protokołów. Ta negocjacje określają, czy połączenie korzysta z protokołu HTTP/1.1, czy HTTP/2.
Jeśli punkt końcowy HTTP/2 jest skonfigurowany bez protokołu TLS, dla punktu końcowego ListenOptions.Protocols należy ustawić HttpProtocols.Http2
. Punkt końcowy z wieloma protokołami, na HttpProtocols.Http1AndHttp2
przykład, nie może być używany bez protokołu TLS, ponieważ nie ma negocjacji. Wszystkie połączenia do niezabezpieczonego punktu końcowego domyślnie używają protokołu HTTP/1.1, a wywołania gRPC kończą się niepowodzeniem.
Aby uzyskać więcej informacji na temat włączania protokołu HTTP/2 i TLS z użyciem Kestrel, zobacz Kestrel konfigurację punktu końcowego.
Uwaga
System macOS nie obsługuje ASP.NET Core gRPC z protokołem TLS przed platformą .NET 8. Dodatkowa konfiguracja jest wymagana do pomyślnego uruchomienia usług gRPC w systemie macOS w przypadku korzystania z platformy .NET 7 lub starszej wersji. Aby uzyskać więcej informacji, zobacz Nie można uruchomić aplikacji gRPC platformy ASP.NET Core w systemie macOS.
Hostowanie usługi gRPC w projektach non-ASP.NET Core
Serwer gRPC platformy ASP.NET Core jest zwykle tworzony na podstawie szablonu gRPC. Plik projektu utworzony przez szablon używa Microsoft.NET.SDK.Web
jako 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
Wartość zestawu SDK automatycznie dodaje odwołanie do platformy ASP.NET Core. Odwołanie pozwala aplikacji na korzystanie z typów ASP.NET Core wymaganych do hostowania serwera.
Serwer gRPC można dodać do projektów non-ASP.NET Core przy użyciu następujących ustawień pliku 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>
Poprzedni plik projektu:
- Nie używa
Microsoft.NET.SDK.Web
jako zestawu SDK. - Dodaje odwołanie do struktury do
Microsoft.AspNetCore.App
.- Odwołanie do platformy umożliwia aplikacjom non-ASP.NET Core, takim jak usługi systemu Windows, aplikacje WPF lub aplikacje WinForms, korzystanie z interfejsów API ASP.NET Core.
- Aplikacja może teraz używać interfejsów API ASP.NET Core do uruchamiania serwera ASP.NET Core.
- Dodaje wymagania dotyczące usługi gRPC:
- Odwołanie do pakietu NuGet
Grpc.AspNetCore
. -
.proto
plik.
- Odwołanie do pakietu NuGet
Aby uzyskać więcej informacji na temat korzystania z dokumentacji platformy, zobacz Microsoft.AspNetCore.App
(Korzystanie z platformy udostępnionej ASP.NET Core).
Integracja z interfejsami API platformy ASP.NET Core
Usługi gRPC mają pełny dostęp do funkcji ASP.NET Core, takich jak wstrzykiwanie zależności (DI) i logowanie. Na przykład implementacja usługi może rozpoznać usługę rejestratora z kontenera DI za pomocą konstruktora:
public class GreeterService : Greeter.GreeterBase
{
public GreeterService(ILogger<GreeterService> logger)
{
}
}
Domyślnie implementacja serwisu gRPC może rozpoznawać inne serwisy DI z dowolnym okresem istnienia (Singleton, Scoped lub Przejściowy).
Rozwiązywanie problemów z protokołem HttpContext w metodach gRPC
Interfejs API gRPC zapewnia dostęp do niektórych danych wiadomości HTTP/2, takich jak metoda, host, nagłówek i trailery. Dostęp odbywa się za pośrednictwem argumentu przekazanego ServerCallContext
do każdej metody 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
nie zapewnia pełnego dostępu do HttpContext
wszystkich interfejsów API ASP.NET. Metoda rozszerzenia GetHttpContext
zapewnia pełny dostęp do elementu HttpContext
, który reprezentuje bazowy komunikat HTTP/2 w interfejsach 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
});
}
}