Migración de servicios gRPC de C-core a ASP.NET Core
Debido a la implementación de la pila subyacente, no todas las características funcionan de la misma manera entre aplicaciones gRPC basadas en C-core y aplicaciones basadas en ASP.NET Core. En este documento se destacan las diferencias principales para realizar migraciones entre las dos pilas.
Importante
gRPC C-core está en modo de mantenimiento y dejará de utilizarse en favor de gRPC para .NET. No se recomienda gRPC C-core para nuevas aplicaciones.
Duración de la implementación del servicio gRPC
En la pila de ASP.NET Core, los servicios gRPC se crean de forma predeterminada con una duración restringida. En cambio, gRPC C-core se enlaza de forma predeterminada a un servicio con una duración singleton.
Una duración restringida permite que la implementación del servicio resuelva otros servicios con duraciones restringidas. Por ejemplo, una duración restringida también puede resolver DbContext desde el contenedor de inserción de dependencias a través de la inserción de constructores. Si se usa una duración restringida:
- Se crea una instancia de la implementación del servicio para cada solicitud.
- No es posible compartir el estado entre solicitudes a través de miembros de instancia en el tipo de implementación.
- Lo normal es almacenar los estados compartidos en un servicio singleton en el contenedor de inserción de dependencias. Los estados compartidos almacenados se resuelven en el constructor de la implementación del servicio gRPC.
Para obtener más información sobre la duración de los servicios, consulte Inserción de dependencias en ASP.NET Core.
Adición de un servicio singleton
Para facilitar la transición de una implementación de gRPC de C-core a ASP.NET Core, se puede cambiar la duración de la implementación del servicio de restringida a singleton. Esto implica agregar una instancia de la implementación del servicio al contenedor de inserción de dependencias:
public void ConfigureServices(IServiceCollection services)
{
services.AddGrpc();
services.AddSingleton(new GreeterService());
}
Sin embargo, una implementación del servicio con una duración singleton ya no puede resolver los servicios restringidos a través de la inserción de constructores.
Configuración de las opciones de servicios gRPC
En las aplicaciones basadas en C-core, los valores como grpc.max_receive_message_length y grpc.max_send_message_length se configuran con ChannelOption en el momento de crear la instancia del servidor.
En ASP.NET Core, gRPC proporciona la configuración a través del tipo GrpcServiceOptions. Por ejemplo, el tamaño máximo del mensaje entrante del servicio gRPC se puede configurar mediante AddGrpc. En el ejemplo siguiente, se cambia el valor predeterminado de MaxReceiveMessageSize de 4 MB a 16 MB:
public void ConfigureServices(IServiceCollection services)
{
services.AddGrpc(options =>
{
options.MaxReceiveMessageSize = 16 * 1024 * 1024; // 16 MB
});
}
Para obtener más información sobre la configuración, vea Configuración gRPC para .NET.
Registro
Las aplicaciones basadas en C-core usan GrpcEnvironment para configurar el registrador con fines de depuración. La pila de ASP.NET Core proporciona esta funcionalidad a través de la API de registro. Por ejemplo, se puede agregar un registrador al servicio gRPC mediante la inserción de constructores:
public class GreeterService : Greeter.GreeterBase
{
public GreeterService(ILogger<GreeterService> logger)
{
}
}
HTTPS
Las aplicaciones basadas en C-core configuran HTTPS mediante la propiedad Server.Ports. Se usa un concepto similar para configurar servidores en ASP.NET Core. Por ejemplo, Kestrel usa la configuración de puntos de conexión para esta funcionalidad.
Las aplicaciones basadas en C-core configuran HTTPS mediante la propiedad Server.Ports. Se usa un concepto similar para configurar servidores en ASP.NET Core. Por ejemplo, Kestrel usa la configuración de puntos de conexión para esta funcionalidad.
Interceptores de gRPC frente a middleware
El middleware de ASP.NET Core ofrece funcionalidades similares a los interceptores de aplicaciones gRPC basadas en C-core. El middleware y los interceptores de ASP.NET Core son conceptualmente similares. Ambos:
- Se usan para construir una canalización que controla una solicitud gRPC.
- Permiten que se realicen tareas antes o después del siguiente componente de la canalización.
- Proporcionan acceso a
HttpContext:- En el middleware,
HttpContextes un parámetro. - En los interceptores, se puede acceder a
HttpContextmediante el parámetroServerCallContextcon el método de extensiónServerCallContext.GetHttpContext. Tenga en cuenta que esta característica es específica de los interceptores que se ejecutan en ASP.NET Core.
- En el middleware,
Diferencias entre los interceptores de gRPC y el middleware de ASP.NET Core:
- Interceptores:
- Operan en el nivel de abstracción de gRPC mediante la clase ServerCallContext.
- Proporcionan acceso a los elementos siguientes:
- Al mensaje deserializado que se envía a una llamada.
- Al mensaje que devuelve la llamada antes de que se serialice.
- Pueden detectar y controlar las excepciones que se producen en los servicios gRPC.
- Middleware:
- Se ejecuta antes que los interceptores de gRPC.
- Opera en los mensajes HTTP/2 subyacentes.
- Solo puede acceder a los bytes de las secuencias de solicitud y respuesta.