Serviços gRPC com ASP.NET Core
Observação
Esta não é a versão mais recente deste artigo. Para a versão atual, consulte a versão .NET 9 deste artigo.
Advertência
Esta versão do ASP.NET Core não é mais suportada. Para obter mais informações, consulte a Política de suporte do .NET e .NET Core. Para a versão atual, consulte a versão .NET 9 deste artigo.
Importante
Estas informações referem-se a um produto de pré-lançamento que pode ser substancialmente modificado antes de ser lançado comercialmente. A Microsoft não oferece garantias, expressas ou implícitas, em relação às informações fornecidas aqui.
Para a versão atual, consulte a versão .NET 9 deste artigo.
Este documento mostra como começar a usar os serviços gRPC usando o ASP.NET Core.
Pré-requisitos
- Visual Studio
- de código do Visual Studio
- Visual Studio para Mac
Visual Studio 2022 com a carga de trabalho de desenvolvimento de ASP.NET e web.
Introdução ao serviço gRPC no ASP.NET Core
Ver ou descarregar o código de exemplo (como fazer o download).
Consulte Introdução aos serviços gRPC para obter instruções detalhadas sobre como criar um projeto gRPC.
Adicionar serviços gRPC a um aplicativo ASP.NET Core
gRPC requer o Grpc.AspNetCore pacote.
Configurar gRPC
Em Program.cs
:
- gRPC é ativado com o método
AddGrpc
. - Cada serviço gRPC é adicionado ao pipeline de roteamento por meio do método
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();
Se você gostaria de ver os comentários de código traduzidos para outros idiomas além do inglês, informe-nos em este problema de discussão do GitHub.
ASP.NET middleware e os recursos principais compartilham o pipeline de roteamento, portanto, um aplicativo pode ser configurado para atender manipuladores de solicitação adicionais. Os manipuladores de solicitação adicionais, como controladores MVC, funcionam em paralelo com os serviços gRPC configurados.
Opções do servidor
Os serviços gRPC podem ser hospedados por todos os servidores ASP.NET Core integrados.
- Kestrel
- Servidor de Teste
- IIS†
- HTTP.sys†
†Requer .NET 5 e Windows 11 Build 22000 ou Windows Server 2022 Build 20348 ou posterior.
Para obter mais informações sobre como escolher o servidor certo para um aplicativo ASP.NET Core, consulte implementações de servidor Web no ASP.NET Core.
Kestrel
Kestrel é um servidor web multiplataforma para ASP.NET Core. Kestrel se concentra em alto desempenho e utilização de memória, mas não tem alguns dos recursos avançados em HTTP.sys como compartilhamento de portas.
Kestrel pontos finais gRPC:
- Requer HTTP/2.
- Deve ser protegido com Transport Layer Security (TLS).
HTTP/2
gRPC requer HTTP/2. gRPC para ASP.NET Core valida que HttpRequest.Protocol é HTTP/2
.
Kestrel suporta HTTP/2 na maioria dos sistemas operacionais modernos. Kestrel pontos de extremidade são configurados para suportar conexões HTTP/1.1 e HTTP/2 por padrão.
TLS
Kestrel endpoints utilizados para gRPC devem ser protegidos com TLS. No desenvolvimento, um endpoint protegido com TLS é criado automaticamente em https://localhost:5001
quando o certificado de desenvolvimento ASP.NET Core está presente. Nenhuma configuração é necessária. Um prefixo https
verifica que o ponto de extremidade Kestrel está usando TLS.
Na produção, o TLS deve ser explicitamente configurado. No exemplo seguinte appsettings.json
, é apresentado um ponto de extremidade HTTP/2 protegido com TLS:
{
"Kestrel": {
"Endpoints": {
"HttpsInlineCertFile": {
"Url": "https://localhost:5001",
"Protocols": "Http2",
"Certificate": {
"Path": "<path to .pfx file>",
"Password": "<certificate password>"
}
}
}
}
}
Como alternativa, os pontos de extremidade Kestrel podem ser configurados em 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>");
});
});
Para obter mais informações sobre como habilitar o TLS com Kestrel, consulte Kestrelde configuração do ponto de extremidade HTTPS.
Negociação de protocolos
O TLS é usado para mais do que proteger a comunicação. A negociação do protocolo TLS Application-Layer (ALPN) através do aperto de mão é utilizada para acertar o protocolo de conexão entre o cliente e o servidor quando um ponto de extremidade suporta vários protocolos. Essa negociação determina se a conexão usa HTTP/1.1 ou HTTP/2.
Se um ponto de extremidade HTTP/2 estiver configurado sem TLS, os ListenOptions.Protocols do ponto de extremidade deverão ser definidos como HttpProtocols.Http2
. Um ponto de extremidade com vários protocolos, como HttpProtocols.Http1AndHttp2
por exemplo, não pode ser usado sem TLS porque não há negociação. Todas as ligações para o endpoint não seguro usam por padrão HTTP/1.1, e as chamadas gRPC falham.
Para obter mais informações sobre como habilitar HTTP/2 e TLS com Kestrel, consulte Kestrel endpoint configuration.
Observação
O macOS não suporta ASP.NET Core gRPC com TLS antes do .NET 8. É necessária uma configuração adicional para executar com êxito os serviços gRPC no macOS ao usar o .NET 7 ou anterior. Para obter mais informações, consulte Não é possível iniciar aplicativo gRPC do ASP.NET Core no macOS.
IIS
Os Serviços de Informações da Internet (IIS) é um servidor web flexível, seguro e gerível para hospedar aplicações web, incluindo o ASP.NET Core. O .NET 5 e o Windows 11 Build 22000 ou o Windows Server 2022 Build 20348 ou posterior são necessários para hospedar serviços gRPC com o IIS.
O IIS deve ser configurado para usar TLS e HTTP/2. Para obter mais informações, consulte Usar o ASP.NET Core com HTTP/2 no IIS.
HTTP.sys
HTTP.sys é um servidor web para ASP.NET Core que só é executado no Windows. O .NET 5 e o Windows 11 Build 22000 ou o Windows Server 2022 Build 20348 ou posterior são necessários para hospedar serviços gRPC com HTTP.sys.
HTTP.sys deve ser configurado para usar TLS e HTTP/2. Para obter mais informações, consulte o suporte HTTP/2 do servidor Web HTTP.sys.
Hospedar gRPC em projetos que não usam ASP.NET Core
Um servidor gRPC ASP.NET Core normalmente é criado a partir do modelo gRPC. O arquivo de projeto criado pelo modelo usa Microsoft.NET.SDK.Web
como o 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>
O valor Microsoft.NET.SDK.Web
SDK adiciona automaticamente uma referência à estrutura ASP.NET Core. A referência permite que o aplicativo use ASP.NET tipos Core necessários para hospedar um servidor.
Você pode adicionar um servidor gRPC a non-ASP.NET projetos principais com as seguintes configurações de arquivo de projeto:
<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>
O arquivo de projeto anterior:
- Não usa
Microsoft.NET.SDK.Web
como SDK. - Adiciona uma referência de estrutura a
Microsoft.AspNetCore.App
.- A referência de estrutura permite que aplicativos non-ASP.NET Core, como Serviços do Windows, aplicativos WPF ou aplicativos WinForms, usem APIs ASP.NET Core.
- O aplicativo agora pode usar APIs ASP.NET Core para iniciar um servidor ASP.NET Core.
- Adiciona requisitos gRPC:
- Referência do pacote NuGet para
Grpc.AspNetCore
. -
.proto
arquivo.
- Referência do pacote NuGet para
Para obter mais informações sobre como usar a referência da estrutura Microsoft.AspNetCore.App
, consulte Usar a estrutura compartilhada do ASP.NET Core.
Integração com APIs ASP.NET Core
Os serviços gRPC têm acesso total aos recursos ASP.NET Core, como de injeção de dependência (DI) e registro em log . Por exemplo, a implementação do serviço pode resolver um serviço de registrador do contêiner DI.
Injeção do construtor:
public class GreeterService : Greeter.GreeterBase
{
private readonly ILogger<GreeterService> _logger;
public GreeterService(ILogger<GreeterService> logger)
{
_logger = logger;
}
}
Injeção do construtor primário (.NET 8 ou posterior):
public class GreeterService(ILogger<GreeterService> logger) : Greeter.GreeterBase
{
...
}
Por padrão, a implementação do serviço gRPC pode resolver outros serviços DI com qualquer tempo de vida (Singleton, Scoped ou Transient).
Resolver HttpContext em métodos gRPC
A API gRPC fornece acesso a alguns dados de mensagens HTTP/2, como o método, host, cabeçalho e trailers. O acesso é feito através do argumento ServerCallContext
passado para cada método 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
não fornece acesso total a HttpContext
em todas as ASP.NET APIs. O método de extensão GetHttpContext
fornece acesso total ao HttpContext
que representa a mensagem HTTP/2 subjacente em ASP.NET APIs:
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
});
}
}
Recursos adicionais
Este documento mostra como começar a usar os serviços gRPC usando o ASP.NET Core.
Pré-requisitos
- Visual Studio
- de código do Visual Studio
- Visual Studio para Mac
Visual Studio 2022 com a carga de trabalho de ASP.NET e desenvolvimento web.
Introdução ao serviço gRPC no ASP.NET Core
Ver ou descarregar código de exemplo (como fazer o download).
Consulte Introdução aos serviços gRPC para obter instruções detalhadas sobre como criar um projeto gRPC.
Adicionar serviços gRPC a um aplicativo ASP.NET Core
gRPC requer o Grpc.AspNetCore pacote.
Configurar gRPC
Em Program.cs
:
- gRPC é ativado com o método
AddGrpc
. - Cada serviço gRPC é adicionado ao pipeline de roteamento por meio do método
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();
Se você gostaria de ver os comentários de código traduzidos para outros idiomas além do inglês, informe-nos em este problema de discussão do GitHub.
ASP.NET middleware e os recursos principais compartilham o pipeline de roteamento, portanto, um aplicativo pode ser configurado para atender manipuladores de solicitação adicionais. Os manipuladores de solicitação adicionais, como controladores MVC, funcionam em paralelo com os serviços gRPC configurados.
Opções do servidor
Os serviços gRPC podem ser hospedados por todos os servidores ASP.NET Core integrados.
- Kestrel
- TestServer
- IIS†
- HTTP.sys†
†Requer .NET 5 e Windows 11 Build 22000 ou Windows Server 2022 Build 20348 ou posterior.
Para obter mais informações sobre como escolher o servidor certo para um aplicativo ASP.NET Core, consulte implementações de servidor Web no ASP.NET Core.
Kestrel
Kestrel é um servidor web multiplataforma para ASP.NET Core. Kestrel se concentra em alto desempenho e utilização de memória, mas não tem alguns dos recursos avançados em HTTP.sys como compartilhamento de portas.
Kestrel pontos finais gRPC:
- Requer HTTP/2.
- Deve ser protegido com Transport Layer Security (TLS).
HTTP/2
gRPC requer HTTP/2. gRPC para ASP.NET Core valida HttpRequest.Protocol é HTTP/2
.
Kestrel suporta HTTP/2 na maioria dos sistemas operacionais modernos. Kestrel endpoints são configurados para suportar conexões HTTP/1.1 e HTTP/2 por defeito.
TLS
Kestrel endpoints usados para gRPC devem estar protegidos com TLS. Durante o desenvolvimento, um endpoint protegido com TLS é criado automaticamente no https://localhost:5001
quando o certificado de desenvolvimento do ASP.NET Core está presente. Nenhuma configuração é necessária. Um prefixo https
verifica que o ponto de extremidade Kestrel está usando TLS.
Na produção, o TLS deve ser explicitamente configurado. No exemplo appsettings.json
a seguir, é fornecido um endpoint HTTP/2 protegido com TLS:
{
"Kestrel": {
"Endpoints": {
"HttpsInlineCertFile": {
"Url": "https://localhost:5001",
"Protocols": "Http2",
"Certificate": {
"Path": "<path to .pfx file>",
"Password": "<certificate password>"
}
}
}
}
}
Como alternativa, os pontos de extremidade Kestrel podem ser configurados em 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>");
});
});
Para obter mais informações sobre como ativar o TLS com Kestrel, consulte a configuração do ponto de extremidade HTTPS em Kestrel.
Negociação de protocolos
O TLS é usado para mais do que proteger a comunicação. O handshake de TLSApplication-Layer Protocol Negotiation (ALPN) é usado para negociar o protocolo de conexão entre o cliente e o servidor quando um ponto de extremidade oferece suporte a vários protocolos. Essa negociação determina se a conexão usa HTTP/1.1 ou HTTP/2.
Se um ponto de extremidade HTTP/2 estiver configurado sem TLS, o ListenOptions.Protocols do ponto de extremidade deverá ser definido como HttpProtocols.Http2
. Um ponto de extremidade com vários protocolos, como HttpProtocols.Http1AndHttp2
por exemplo, não pode ser utilizado sem TLS, pois não há possibilidade de negociação. Todas as conexões com o ponto de extremidade não seguro são por padrão em HTTP/1.1, e as chamadas gRPC falham.
Para obter mais informações sobre como habilitar HTTP/2 e TLS com Kestrel, consulte Kestrel endpoint configuration.
Observação
O macOS não suporta ASP.NET Core gRPC com TLS antes do .NET 8. É necessária uma configuração adicional para executar com êxito os serviços gRPC no macOS ao usar o .NET 7 ou anterior. Para mais informações, consulte Não é possível iniciar a aplicação gRPC do ASP.NET Core no macOS.
IIS
dos Serviços de Informações da Internet (IIS) é um servidor Web flexível, seguro e gerenciável para hospedar aplicativos Web, incluindo o ASP.NET Core. O .NET 5 e o Windows 11 Build 22000 ou o Windows Server 2022 Build 20348 ou posterior são necessários para hospedar serviços gRPC com o IIS.
O IIS deve ser configurado para usar TLS e HTTP/2. Para obter mais informações, consulte Usar o ASP.NET Core com HTTP/2 no IIS.
HTTP.sys
HTTP.sys é um servidor web para ASP.NET Core que só é executado no Windows. O .NET 5 e o Windows 11 Build 22000 ou o Windows Server 2022 Build 20348 ou posterior são necessários para hospedar serviços gRPC com HTTP.sys.
HTTP.sys deve ser configurado para usar TLS e HTTP/2. Para obter mais informações, consulte o suporte HTTP/2 do servidor Web HTTP.sys.
Hospedar gRPC em projetos que não sejam ASP.NET Core
Um servidor gRPC ASP.NET Core normalmente é criado a partir do modelo gRPC. O arquivo de projeto criado pelo modelo usa Microsoft.NET.SDK.Web
como o 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>
O valor Microsoft.NET.SDK.Web
SDK adiciona automaticamente uma referência à estrutura ASP.NET Core. A referência permite que o aplicativo use ASP.NET tipos Core necessários para hospedar um servidor.
Você pode adicionar um servidor gRPC a non-ASP.NET projetos principais com as seguintes configurações de arquivo de projeto:
<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>
O arquivo de projeto anterior:
- Não usa
Microsoft.NET.SDK.Web
como SDK. - Adiciona uma referência de framework a
Microsoft.AspNetCore.App
.- A referência de estrutura permite que aplicativos non-ASP.NET Core, como Serviços do Windows, aplicativos WPF ou aplicativos WinForms, usem APIs ASP.NET Core.
- O aplicativo agora pode usar APIs ASP.NET Core para iniciar um servidor ASP.NET Core.
- Adiciona requisitos gRPC:
- Referência do pacote NuGet para
Grpc.AspNetCore
. -
.proto
arquivo.
- Referência do pacote NuGet para
Para obter mais informações sobre como usar a referência da estrutura Microsoft.AspNetCore.App
, consulte Usar a estrutura compartilhada do ASP.NET Core.
Integração com APIs ASP.NET Core
Os serviços gRPC têm acesso total aos recursos ASP.NET Core, como Dependency Injection (DI) e Logging. Por exemplo, a implementação do serviço pode resolver um serviço de registrador do contêiner DI por meio do construtor:
public class GreeterService : Greeter.GreeterBase
{
public GreeterService(ILogger<GreeterService> logger)
{
}
}
Por predefinição, a implementação do serviço gRPC pode resolver outros serviços de DI com qualquer duração (Singleton, Scoped ou Transient).
Resolver HttpContext em métodos gRPC
A API gRPC fornece acesso a alguns dados de mensagens HTTP/2, como o método, host, cabeçalho e trailers. O acesso é feito através do argumento ServerCallContext
passado para cada método 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
não fornece acesso total a HttpContext
em todas as ASP.NET APIs. O método de extensão GetHttpContext
fornece acesso total ao HttpContext
que representa a mensagem HTTP/2 subjacente em ASP.NET APIs:
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
});
}
}
Recursos adicionais
Este documento mostra como começar a usar os serviços gRPC usando o ASP.NET Core.
Pré-requisitos
- Visual Studio
- de código do Visual Studio
- Visual Studio para Mac
- Visual Studio 2022 com a carga de trabalho de ASP.NET e desenvolvimento web.
- SDK do .NET 6.0
Introdução ao serviço gRPC no ASP.NET Core
Ver ou descarregar código de exemplo (como fazer o download).
Consulte Introdução aos serviços gRPC para obter instruções detalhadas sobre como criar um projeto gRPC.
Adicionar serviços gRPC a um aplicativo ASP.NET Core
gRPC requer o Grpc.AspNetCore pacote.
Configurar gRPC
Em Program.cs
:
- gRPC é ativado com o método
AddGrpc
. - Cada serviço gRPC é adicionado ao pipeline de roteamento por meio do método
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();
Se você gostaria de ver os comentários de código traduzidos para outros idiomas além do inglês, informe-nos em este problema de discussão do GitHub.
ASP.NET middleware e os recursos principais compartilham o pipeline de roteamento, portanto, um aplicativo pode ser configurado para atender manipuladores de solicitação adicionais. Os manipuladores de solicitação adicionais, como controladores MVC, funcionam em paralelo com os serviços gRPC configurados.
Opções do servidor
Os serviços gRPC podem ser hospedados por todos os servidores ASP.NET Core integrados.
- Kestrel
- Servidor de Teste
- IIS†
- HTTP.sys†
†Requer .NET 5 e Windows 11 Build 22000 ou Windows Server 2022 Build 20348 ou posterior.
Para obter mais informações sobre como escolher o servidor certo para um aplicativo ASP.NET Core, consulte implementações de servidor Web no ASP.NET Core.
Kestrel
Kestrel é um servidor web multiplataforma para ASP.NET Core. Kestrel se concentra em alto desempenho e utilização de memória, mas não tem alguns dos recursos avançados em HTTP.sys como compartilhamento de portas.
Kestrel pontos finais gRPC:
- Requer HTTP/2.
- Deve ser protegido com Transport Layer Security (TLS).
HTTP/2
gRPC requer HTTP/2. gRPC para ASP.NET Core valida se HttpRequest.Protocol é HTTP/2
.
Kestrel suporta HTTP/2 na maioria dos sistemas operacionais modernos. Kestrel endpoints são configurados para suportar conexões HTTP/1.1 e HTTP/2 por padrão.
TLS
Kestrel pontos finais usados para gRPC devem ser protegidos com TLS. Durante o desenvolvimento, um endpoint protegido com TLS é criado automaticamente no https://localhost:5001
quando o certificado de desenvolvimento do ASP.NET Core está disponível. Nenhuma configuração é necessária. O prefixo https
verifica que o ponto de extremidade Kestrel está usando TLS.
Na produção, o TLS deve ser explicitamente configurado. No exemplo seguinte de appsettings.json
, é fornecido um endereço HTTP/2 protegido com TLS:
{
"Kestrel": {
"Endpoints": {
"HttpsInlineCertFile": {
"Url": "https://localhost:5001",
"Protocols": "Http2",
"Certificate": {
"Path": "<path to .pfx file>",
"Password": "<certificate password>"
}
}
}
}
}
Como alternativa, os pontos de extremidade Kestrel podem ser configurados em 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>");
});
});
Para obter mais informações sobre como habilitar o TLS com Kestrel, consulte Kestrelde configuração do ponto de extremidade HTTPS.
Negociação de protocolos
O TLS é usado para mais do que proteger a comunicação. O handshake do Protocolo de Negociação (ALPN) TLS Application-Layer é usado para negociar o protocolo de conexão entre o cliente e o servidor quando um ponto de acesso suporta vários protocolos. Essa negociação determina se a conexão usa HTTP/1.1 ou HTTP/2.
Se um ponto de extremidade HTTP/2 estiver configurado sem TLS, o ListenOptions.Protocols do ponto de extremidade deverá ser definido como HttpProtocols.Http2
. Um endpoint com vários protocolos, como o HttpProtocols.Http1AndHttp2
, por exemplo, não pode ser usado sem TLS porque não há negociação. Todas as conexões para o ponto de extremidade não seguro utilizam por padrão o HTTP/1.1 e as chamadas gRPC falham.
Para obter mais informações sobre como habilitar HTTP/2 e TLS com Kestrel, consulte Kestrel endpoint configuration.
Observação
O macOS não suporta ASP.NET Core gRPC com TLS antes do .NET 8. É necessária uma configuração adicional para executar com êxito os serviços gRPC no macOS ao usar o .NET 7 ou anterior. Para obter mais informações, consulte Não é possível iniciar a aplicação ASP.NET Core gRPC no macOS.
IIS
Os Serviços de Informações da Internet (IIS) são um servidor Web flexível, seguro e gerível para alojar aplicações Web, incluindo o ASP.NET Core. O .NET 5 e o Windows 11 Build 22000 ou o Windows Server 2022 Build 20348 ou posterior são necessários para hospedar serviços gRPC com o IIS.
O IIS deve ser configurado para usar TLS e HTTP/2. Para obter mais informações, consulte Usar o ASP.NET Core com HTTP/2 no IIS.
HTTP.sys
HTTP.sys é um servidor web para ASP.NET Core que só é executado no Windows. O .NET 5 ou o Windows 11 Build 22000 ou o Windows Server 2022 Build 20348 ou posterior são necessários para hospedar serviços gRPC com HTTP.sys.
HTTP.sys deve ser configurado para usar TLS e HTTP/2. Para obter mais informações, consulte HTTP.sys suporte HTTP/2 do servidor Web.
Hospedar gRPC em projetos que não são ASP.NET Core
Um servidor gRPC ASP.NET Core normalmente é criado a partir do modelo gRPC. O arquivo de projeto criado pelo modelo usa Microsoft.NET.SDK.Web
como o 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>
O valor Microsoft.NET.SDK.Web
SDK adiciona automaticamente uma referência à estrutura ASP.NET Core. A referência permite que o aplicativo use ASP.NET tipos Core necessários para hospedar um servidor.
Você pode adicionar um servidor gRPC a non-ASP.NET projetos principais com as seguintes configurações de arquivo de projeto:
<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>
O arquivo de projeto anterior:
- Não usa
Microsoft.NET.SDK.Web
como SDK. - Adiciona uma referência de estrutura a
Microsoft.AspNetCore.App
.- A referência de estrutura permite que aplicativos non-ASP.NET Core, como Serviços do Windows, aplicativos WPF ou aplicativos WinForms, usem APIs ASP.NET Core.
- O aplicativo agora pode usar APIs ASP.NET Core para iniciar um servidor ASP.NET Core.
- Adiciona requisitos gRPC:
- Referência do pacote NuGet para
Grpc.AspNetCore
. -
.proto
arquivo.
- Referência do pacote NuGet para
Para obter mais informações sobre como usar a referência da estrutura Microsoft.AspNetCore.App
, consulte Usar a estrutura compartilhada do ASP.NET Core.
Integração com APIs ASP.NET Core
Os serviços gRPC têm acesso total aos recursos ASP.NET Core, como Dependency Injection (DI) e Logging. Por exemplo, a implementação do serviço pode resolver um serviço de registrador do contêiner DI por meio do construtor:
public class GreeterService : Greeter.GreeterBase
{
public GreeterService(ILogger<GreeterService> logger)
{
}
}
Por padrão, a implementação do serviço gRPC pode resolver outros serviços DI com qualquer ciclo de vida (Singleton, Scoped ou Transient).
Resolver HttpContext em métodos gRPC
A API gRPC fornece acesso a alguns dados de mensagens HTTP/2, como o método, host, cabeçalho e trailers. O acesso é feito através do argumento ServerCallContext
passado para cada método 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
não fornece acesso total a HttpContext
em todas as ASP.NET APIs. O método de extensão GetHttpContext
fornece acesso total ao HttpContext
que representa a mensagem HTTP/2 subjacente em ASP.NET APIs:
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
});
}
}
Recursos adicionais
Este documento mostra como começar a usar os serviços gRPC usando o ASP.NET Core.
Pré-requisitos
- Visual Studio
- de código do Visual Studio
- Visual Studio para Mac
- Visual Studio 2019 16.8 ou posterior com a carga de trabalho de ASP.NET e desenvolvimento Web
- SDK do .NET 5.0
Introdução ao serviço gRPC no ASP.NET Core
Ver ou fazer download do código de exemplo (como fazer o download).
Consulte Introdução aos serviços gRPC para obter instruções detalhadas sobre como criar um projeto gRPC.
Adicionar serviços gRPC a um aplicativo ASP.NET Core
gRPC requer o Grpc.AspNetCore pacote.
Configurar gRPC
Em Startup.cs
:
- gRPC é ativado com o método
AddGrpc
. - Cada serviço gRPC é adicionado ao pipeline de roteamento por meio do método
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>();
});
}
}
Se gostaria de ver os comentários de código traduzidos para outros idiomas além do inglês, informe-nos através deste tópico de discussão do GitHub .
O middleware do ASP.NET Core e as funcionalidades partilham o pipeline de roteamento, portanto, uma aplicação pode ser configurada para atender manipuladores de solicitação adicionais. Os manipuladores de solicitação adicionais, como controladores MVC, funcionam em paralelo com os serviços gRPC configurados.
Opções do servidor
Os serviços gRPC podem ser hospedados por todos os servidores ASP.NET Core integrados.
- Kestrel
- Servidor de Testes
- IIS†
- HTTP.sys†
†Requer .NET 5 e Windows 11 Build 22000 ou Windows Server 2022 Build 20348 ou posterior.
Para obter mais informações sobre como escolher o servidor certo para um aplicativo ASP.NET Core, consulte implementações de servidor Web no ASP.NET Core.
Kestrel
Kestrel é um servidor web multiplataforma para ASP.NET Core. Kestrel se concentra em alto desempenho e utilização de memória, mas não tem alguns dos recursos avançados em HTTP.sys como compartilhamento de portas.
Kestrel pontos finais gRPC:
- Requer HTTP/2.
- Deve ser protegido com Transport Layer Security (TLS).
HTTP/2
gRPC requer HTTP/2. gRPC para ASP.NET Core valida HttpRequest.Protocol é HTTP/2
.
Kestrel suporta HTTP/2 na maioria dos sistemas operacionais modernos. Kestrel endpoints são configurados para suportar conexões HTTP/1.1 e HTTP/2 por padrão.
TLS
Kestrel pontos finais usados para gRPC devem ser protegidos com TLS. Durante o desenvolvimento, um endpoint protegido com TLS é criado automaticamente no https://localhost:5001
quando o certificado de desenvolvimento do ASP.NET Core está presente. Nenhuma configuração é necessária. Um prefixo https
verifica se o ponto de extremidade Kestrel está a usar TLS.
Na produção, o TLS deve ser explicitamente configurado. No exemplo appsettings.json
a seguir, um endpoint HTTP/2 protegido com TLS é fornecido:
{
"Kestrel": {
"Endpoints": {
"HttpsInlineCertFile": {
"Url": "https://localhost:5001",
"Protocols": "Http2",
"Certificate": {
"Path": "<path to .pfx file>",
"Password": "<certificate password>"
}
}
}
}
}
Alternativamente, endpoints Kestrel podem ser configurados em 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>();
});
Para obter mais informações sobre como habilitar o TLS com Kestrel, consulte a configuração do ponto de extremidade HTTPS em Kestrel.
Negociação de protocolos
O TLS é usado para mais do que proteger a comunicação. O handshake de TLSApplication-Layer Protocol Negotiation (ALPN) é usado para negociar o protocolo de conexão entre o cliente e o servidor quando um ponto de extremidade oferece suporte a vários protocolos. Essa negociação determina se a conexão usa HTTP/1.1 ou HTTP/2.
Se um ponto de extremidade HTTP/2 estiver configurado sem TLS, o ListenOptions.Protocols do ponto de extremidade deverá ser definido como HttpProtocols.Http2
. Um ponto de extremidade com vários protocolos, como HttpProtocols.Http1AndHttp2
por exemplo, não pode ser usado sem TLS porque não há negociação. Todas as ligações ao ponto de extremidade não seguro usam HTTP/1.1, e as chamadas gRPC falham.
Para obter mais informações sobre como habilitar HTTP/2 e TLS com Kestrel, consulte Kestrel endpoint configuration.
Observação
O macOS não suporta ASP.NET Core gRPC com TLS antes do .NET 8. É necessária uma configuração adicional para executar com êxito os serviços gRPC no macOS ao usar o .NET 7 ou anterior. Para mais informações, consulte Não é possível iniciar o aplicativo ASP.NET Core gRPC no macOS.
IIS
Serviços de Informações da Internet (IIS) é um servidor Web flexível, seguro e gerível para hospedar aplicações web, incluindo o ASP.NET Core. O .NET 5 e o Windows 11 Build 22000 ou o Windows Server 2022 Build 20348 ou posterior são necessários para hospedar serviços gRPC com o IIS.
O IIS deve ser configurado para usar TLS e HTTP/2. Para obter mais informações, consulte Usar o ASP.NET Core com HTTP/2 no IIS.
HTTP.sys
HTTP.sys é um servidor web para ASP.NET Core que só é executado no Windows. O .NET 5 e o Windows 11 Build 22000 ou o Windows Server 2022 Build 20348 ou posterior são necessários para hospedar serviços gRPC com HTTP.sys.
HTTP.sys deve ser configurado para usar TLS e HTTP/2. Para obter mais informações, consulte o suporte do servidor Web a HTTP/2 HTTP.sys.
Hospedar gRPC em projetos fora do ASP.NET Core
Um servidor gRPC ASP.NET Core normalmente é criado a partir do modelo gRPC. O arquivo de projeto criado pelo modelo usa Microsoft.NET.SDK.Web
como o 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>
O valor Microsoft.NET.SDK.Web
SDK adiciona automaticamente uma referência à estrutura ASP.NET Core. A referência permite que o aplicativo use ASP.NET tipos Core necessários para hospedar um servidor.
Você pode adicionar um servidor gRPC a non-ASP.NET projetos principais com as seguintes configurações de arquivo de projeto:
<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>
O arquivo de projeto anterior:
- Não usa
Microsoft.NET.SDK.Web
como SDK. - Adiciona uma referência de estrutura a
Microsoft.AspNetCore.App
.- A referência de estrutura permite que aplicativos non-ASP.NET Core, como Serviços do Windows, aplicativos WPF ou aplicativos WinForms, usem APIs ASP.NET Core.
- O aplicativo agora pode usar APIs ASP.NET Core para iniciar um servidor ASP.NET Core.
- Adiciona requisitos gRPC:
- Referência do pacote NuGet para
Grpc.AspNetCore
. -
.proto
arquivo.
- Referência do pacote NuGet para
Para obter mais informações sobre como usar a referência da estrutura Microsoft.AspNetCore.App
, consulte Usar a estrutura compartilhada do ASP.NET Core.
Integração com APIs ASP.NET Core
Os serviços gRPC têm acesso total aos recursos ASP.NET Core, como Dependency Injection (DI) e Logging. Por exemplo, a implementação do serviço pode resolver um serviço de registrador do contêiner DI por meio do construtor:
public class GreeterService : Greeter.GreeterBase
{
public GreeterService(ILogger<GreeterService> logger)
{
}
}
Por padrão, a implementação do serviço gRPC pode resolver outros serviços DI com qualquer ciclo de vida (Singleton, Scoped ou Transient).
Resolver HttpContext em métodos gRPC
A API gRPC fornece acesso a alguns dados de mensagens HTTP/2, como o método, host, cabeçalho e trailers. O acesso é feito através do argumento ServerCallContext
passado para cada método 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
não fornece acesso total a HttpContext
em todas as ASP.NET APIs. O método de extensão GetHttpContext
fornece acesso total ao HttpContext
que representa a mensagem HTTP/2 subjacente em ASP.NET APIs:
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
});
}
}
Recursos adicionais
Este documento mostra como começar a usar os serviços gRPC usando o ASP.NET Core.
Pré-requisitos
- Visual Studio
- de código do Visual Studio
- Visual Studio para Mac
- Visual Studio 2019 16.4 ou posterior com a carga de trabalho de ASP.NET e desenvolvimento Web
- SDK do .NET Core 3.1
Introdução ao serviço gRPC no ASP.NET Core
Ver ou descarregar código de amostra (como descarregar).
Consulte Introdução aos serviços gRPC para obter instruções detalhadas sobre como criar um projeto gRPC.
Adicionar serviços gRPC a um aplicativo ASP.NET Core
gRPC requer o Grpc.AspNetCore pacote.
Configurar gRPC
Em Startup.cs
:
- gRPC é ativado com o método
AddGrpc
. - Cada serviço gRPC é adicionado ao pipeline de roteamento por meio do método
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>();
});
}
}
Se gostaria de ver os comentários de código traduzidos para outros idiomas além do inglês, informe-nos em neste tópico de discussão no GitHub.
ASP.NET middleware e os recursos principais compartilham o pipeline de roteamento, portanto, um aplicativo pode ser configurado para atender manipuladores de solicitação adicionais. Os manipuladores de solicitação adicionais, como controladores MVC, funcionam em paralelo com os serviços gRPC configurados.
Opções do servidor
Os serviços gRPC podem ser hospedados por todos os servidores ASP.NET Core integrados.
- Kestrel
- TestServer
- IIS†
- HTTP.sys†
†Requer .NET 5 e Windows 11 Build 22000 ou Windows Server 2022 Build 20348 ou posterior.
Para obter mais informações sobre como escolher o servidor certo para um aplicativo ASP.NET Core, consulte implementações de servidor Web no ASP.NET Core.
Kestrel
Kestrel é um servidor web multiplataforma para ASP.NET Core. Kestrel se concentra em alto desempenho e utilização de memória, mas não tem alguns dos recursos avançados em HTTP.sys como compartilhamento de portas.
Kestrel pontos finais gRPC:
- Requer HTTP/2.
- Deve ser protegido com Transport Layer Security (TLS).
HTTP/2
gRPC requer HTTP/2. gRPC para ASP.NET Core valida HttpRequest.Protocol está HTTP/2
.
Kestrel suporta HTTP/2 na maioria dos sistemas operacionais modernos. Kestrel pontos de extremidade são configurados para suportar conexões HTTP/1.1 e HTTP/2 por definição.
TLS
Kestrel endpoints usados para gRPC devem ser protegidos com TLS. No desenvolvimento, é criado automaticamente um endpoint protegido com TLS em https://localhost:5001
ao existir o certificado de desenvolvimento ASP.NET Core. Nenhuma configuração é necessária. Um prefixo https
verifica que o ponto de extremidade Kestrel está a usar TLS.
Na produção, o TLS deve ser explicitamente configurado. No exemplo appsettings.json
a seguir, é fornecido um ponto de extremidade HTTP/2 protegido com TLS:
{
"Kestrel": {
"Endpoints": {
"HttpsInlineCertFile": {
"Url": "https://localhost:5001",
"Protocols": "Http2",
"Certificate": {
"Path": "<path to .pfx file>",
"Password": "<certificate password>"
}
}
}
}
}
Como alternativa, os endpoints Kestrel podem ser configurados em 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>();
});
Para obter mais informações sobre como habilitar o TLS com Kestrel, consulte Kestrelde configuração do ponto de extremidade HTTPS.
Negociação de protocolos
O TLS é usado para mais do que proteger a comunicação. O handshake de TLSApplication-Layer Protocol Negotiation (ALPN) é usado para negociar o protocolo de conexão entre o cliente e o servidor quando um ponto de extremidade oferece suporte a vários protocolos. Essa negociação determina se a conexão usa HTTP/1.1 ou HTTP/2.
Se um ponto de extremidade HTTP/2 estiver configurado sem TLS, o ListenOptions.Protocols do ponto de extremidade deverá ser definido como HttpProtocols.Http2
. Um endpoint com múltiplos protocolos, como o HttpProtocols.Http1AndHttp2
por exemplo, não pode ser usado sem o Transport Layer Security (TLS) porque não há negociação. Todas as conexões com o ponto de extremidade não seguro, por predefinição, são feitas em HTTP/1.1 e as chamadas gRPC falham.
Para obter mais informações sobre como habilitar HTTP/2 e TLS com Kestrel, consulte Kestrel endpoint configuration.
Observação
O macOS não suporta ASP.NET Core gRPC com TLS antes do .NET 8. É necessária uma configuração adicional para executar com êxito os serviços gRPC no macOS ao usar o .NET 7 ou anterior. Para obter mais informações, consulte Não é possível iniciar o aplicativo ASP.NET Core gRPC no macOS.
Hospedar gRPC em projetos fora do ASP.NET Core
Um servidor gRPC ASP.NET Core normalmente é criado a partir do modelo gRPC. O arquivo de projeto criado pelo modelo usa Microsoft.NET.SDK.Web
como o 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>
O valor Microsoft.NET.SDK.Web
SDK adiciona automaticamente uma referência à estrutura ASP.NET Core. A referência permite que o aplicativo use ASP.NET tipos Core necessários para hospedar um servidor.
Você pode adicionar um servidor gRPC a non-ASP.NET projetos principais com as seguintes configurações de arquivo de projeto:
<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>
O arquivo de projeto anterior:
- Não usa
Microsoft.NET.SDK.Web
como SDK. - Adiciona uma referência de estrutura a
Microsoft.AspNetCore.App
.- A referência de estrutura permite que aplicativos non-ASP.NET Core, como Serviços do Windows, aplicativos WPF ou aplicativos WinForms, usem APIs ASP.NET Core.
- O aplicativo agora pode usar APIs ASP.NET Core para iniciar um servidor ASP.NET Core.
- Adiciona os requisitos do gRPC:
- Referência do pacote NuGet para
Grpc.AspNetCore
. -
.proto
arquivo.
- Referência do pacote NuGet para
Para obter mais informações sobre como usar a referência da estrutura Microsoft.AspNetCore.App
, consulte Usar a estrutura compartilhada do ASP.NET Core.
Integração com APIs ASP.NET Core
Os serviços gRPC têm acesso total aos recursos ASP.NET Core, como Dependency Injection (DI) e Logging. Por exemplo, a implementação do serviço pode resolver um serviço de registrador do contêiner DI por meio do construtor:
public class GreeterService : Greeter.GreeterBase
{
public GreeterService(ILogger<GreeterService> logger)
{
}
}
Por padrão, a implementação do serviço gRPC pode resolver outros serviços DI com qualquer tempo de vida (Singleton, Scoped ou Transient).
Resolver HttpContext em métodos gRPC
A API gRPC fornece acesso a alguns dados de mensagens HTTP/2, como o método, host, cabeçalho e trailers. O acesso é feito através do argumento ServerCallContext
passado para cada método 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
não fornece acesso total a HttpContext
em todas as ASP.NET APIs. O método de extensão GetHttpContext
fornece acesso total ao HttpContext
que representa a mensagem HTTP/2 subjacente em ASP.NET APIs:
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
});
}
}
Recursos adicionais
Este documento mostra como começar a usar os serviços gRPC usando o ASP.NET Core.
Pré-requisitos
- Visual Studio
- de código do Visual Studio
- Visual Studio para Mac
- Visual Studio 2019 com o pacote de ASP.NET e desenvolvimento web
- SDK do .NET Core 3.0
Introdução ao serviço gRPC no ASP.NET Core
Ver ou transferir código de exemplo (como transferir).
Consulte Introdução aos serviços gRPC para obter instruções detalhadas sobre como criar um projeto gRPC.
Adicionar serviços gRPC a um aplicativo ASP.NET Core
gRPC requer o Grpc.AspNetCore pacote.
Configurar gRPC
Em Startup.cs
:
- gRPC é ativado com o método
AddGrpc
. - Cada serviço gRPC é adicionado ao pipeline de roteamento por meio do método
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>();
});
}
}
Se tu gostares de ver os comentários de código traduzidos para outros idiomas além do inglês, informa-nos neste tópico de discussão do GitHub .
ASP.NET middleware e os recursos principais compartilham o pipeline de roteamento, portanto, um aplicativo pode ser configurado para atender manipuladores de solicitação adicionais. Os manipuladores de solicitação adicionais, como controladores MVC, funcionam em paralelo com os serviços gRPC configurados.
Opções do servidor
Os serviços gRPC podem ser hospedados por todos os servidores ASP.NET Core integrados.
- Kestrel
- Servidor de Teste
- IIS†
- HTTP.sys†
†Requer .NET 5 e Windows 11 Build 22000 ou Windows Server 2022 Build 20348 ou posterior.
Para obter mais informações sobre como escolher o servidor certo para um aplicativo ASP.NET Core, consulte implementações de servidor Web no ASP.NET Core.
Kestrel
Kestrel é um servidor web multiplataforma para ASP.NET Core. Kestrel se concentra em alto desempenho e utilização de memória, mas não tem alguns dos recursos avançados em HTTP.sys como compartilhamento de portas.
Kestrel pontos finais gRPC:
- Requer o HTTP/2.
- Deve ser protegido com Transport Layer Security (TLS).
HTTP/2
gRPC requer HTTP/2. gRPC para ASP.NET Core valida HttpRequest.Protocol é HTTP/2
.
Kestrel suporta HTTP/2 na maioria dos sistemas operacionais modernos. Kestrel endpoints são configurados para suportar conexões HTTP/1.1 e HTTP/2 por padrão.
TLS
Kestrel endpoints usados para gRPC devem ser protegidos com TLS. Durante o desenvolvimento, um endpoint protegido com TLS é criado automaticamente no https://localhost:5001
quando o certificado de desenvolvimento do ASP.NET Core está presente. Nenhuma configuração é necessária. Um prefixo https
verifica que o ponto de extremidade Kestrel está usando TLS.
Na produção, o TLS deve ser explicitamente configurado. No exemplo de appsettings.json
a seguir, é apresentado um endereço HTTP/2 protegido com TLS:
{
"Kestrel": {
"Endpoints": {
"HttpsInlineCertFile": {
"Url": "https://localhost:5001",
"Protocols": "Http2",
"Certificate": {
"Path": "<path to .pfx file>",
"Password": "<certificate password>"
}
}
}
}
}
Como alternativa, os endpoints Kestrel podem ser configurados em 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>();
});
Para mais informações sobre como ativar o TLS com Kestrel, consulte configuração do endpoint HTTPSKestrel.
Negociação de protocolos
O TLS é usado para mais do que proteger a comunicação. O handshake TLS Application-Layer Protocol Negotiation (ALPN) é usado para negociar o protocolo de conexão entre o cliente e o servidor quando um ponto de extremidade oferece suporte a vários protocolos. Essa negociação determina se a conexão usa HTTP/1.1 ou HTTP/2.
Se um ponto de extremidade HTTP/2 for configurado sem TLS, os ListenOptions.Protocols do ponto de extremidade devem ser definidos como HttpProtocols.Http2
. Um ponto de extremidade com múltiplos protocolos, como HttpProtocols.Http1AndHttp2
, por exemplo, não pode ser usado sem TLS porque não há negociação. Todas as conexões para o ponto de extremidade não seguro utilizam HTTP/1.1 por padrão e as chamadas gRPC falham.
Para obter mais informações sobre como habilitar HTTP/2 e TLS com Kestrel, consulte Kestrel endpoint configuration.
Observação
O macOS não suporta ASP.NET Core gRPC com TLS antes do .NET 8. É necessária uma configuração adicional para executar com êxito os serviços gRPC no macOS ao usar o .NET 7 ou anterior. Para obter mais informações, consulte Não é possível iniciar a aplicação ASP.NET Core gRPC no macOS.
Hospedar gRPC em projetos não baseados em ASP.NET Core
Um servidor gRPC ASP.NET Core normalmente é criado a partir do modelo gRPC. O arquivo de projeto criado pelo modelo usa Microsoft.NET.SDK.Web
como o 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>
O valor Microsoft.NET.SDK.Web
SDK adiciona automaticamente uma referência à estrutura ASP.NET Core. A referência permite que o aplicativo use ASP.NET tipos Core necessários para hospedar um servidor.
Você pode adicionar um servidor gRPC a non-ASP.NET projetos principais com as seguintes configurações de arquivo de projeto:
<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>
O arquivo de projeto anterior:
- Não usa
Microsoft.NET.SDK.Web
como SDK. - Adiciona uma referência de estrutura a
Microsoft.AspNetCore.App
.- A referência de estrutura permite que aplicativos non-ASP.NET Core, como Serviços do Windows, aplicativos WPF ou aplicativos WinForms, usem APIs ASP.NET Core.
- O aplicativo agora pode usar APIs ASP.NET Core para iniciar um servidor ASP.NET Core.
- Adiciona requisitos gRPC:
- Referência do pacote NuGet para
Grpc.AspNetCore
. - Ficheiro
.proto
.
- Referência do pacote NuGet para
Para obter mais informações sobre como usar a referência da estrutura Microsoft.AspNetCore.App
, consulte Usar a estrutura compartilhada do ASP.NET Core.
Integração com APIs ASP.NET Core
Os serviços gRPC têm acesso total às funcionalidades do ASP.NET Core, como Dependency Injection (DI) e Logging. Por exemplo, a implementação do serviço pode resolver um serviço de registrador do contêiner DI por meio do construtor:
public class GreeterService : Greeter.GreeterBase
{
public GreeterService(ILogger<GreeterService> logger)
{
}
}
Por padrão, a implementação do serviço gRPC pode resolver outros serviços DI com qualquer tempo de vida (Singleton, Scoped ou Transient).
Resolver HttpContext em métodos gRPC
A API gRPC fornece acesso a alguns dados de mensagens HTTP/2, como o método, host, cabeçalho e trailers. O acesso é feito através do argumento ServerCallContext
passado para cada método 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
não fornece acesso total a HttpContext
em todas as ASP.NET APIs. O método de extensão GetHttpContext
fornece acesso total ao HttpContext
que representa a mensagem HTTP/2 subjacente em ASP.NET APIs:
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
});
}
}
Recursos adicionais
- Criar um cliente e servidor gRPC do .NET Core no ASP.NET Core
- Visão geral do gRPC no .NET
- serviços gRPC com C#
- Kestrel servidor web no ASP.NET Core