En este artículo vamos a descubrir que existen varias formas de añadir una referencia a un servicio gRPC desde una aplicación cliente. Básicamente es incluir el fichero .proto, con el contrato del servicio que vamos a usar, tanto para los métodos públicos disponibles, como para los tipos de datos a utilizar.
La idea de este artículo es mostrar las opciones que tenemos al añadir una referencia de servicio gRPC desde el asistente de Visual Studio.
Preparación del servicio para exponer el fichero .proto
Vamos a preparar el servicio gRPC (server side), para que sea capaz de exponer el contrato del mismo (fichero .proto). Para eso debemos seguir los siguientes pasos
Actualizar el fichero de proyecto
Para empezar, deberemos indicar al servicio que copie el fichero .proto en el paquete de despliegue/instalación del mismo.
[javascript]<ItemGroup>
<Content Update=»Protos\*»>
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
</ItemGroup>
<ItemGroup>
<Content Include=»Protos\*» CopyToPublishDirectory=»PreserveNewest» />
</ItemGroup>[/javascript]
Añadir Middelware para exponer el endpoint
Desde la configuración inicial, debemos configurar el middleware al pipeline, para que los ficheros estáticos puedan ser servidos. Esto lo hacemos añadiendo una dependencia al paquete
Microsoft.AspNetCore.StaticFiles y llamando al método UseStaticFiles
Si queremos acceder al fichero .proto especifico, debemos configurar el middleware con se muestra a continuación:
[javascript]provider.Mappings[«.proto»] = «text/plain»;
app.UseStaticFiles(new StaticFileOptions
{
FileProvider = new PhysicalFileProvider(Path.Combine(app.Environment.ContentRootPath, «P
RequestPath = «/proto»,
ContentTypeProvider = provider
});[/javascript]
Lista de ficheros proto existentes
Opcionalmente podemos configurar el servicio para que nos muestre una lista de los ficheros existentes en la carpeta correspondiente. Esto lo haremos llamando al método UseDirectoryBrowser y configurándolo del siguiente modo.
[javascript]app.UseDirectoryBrowser(new DirectoryBrowserOptions
{
FileProvider = new PhysicalFileProvider(Path.Combine(app.Environment.ContentRootPath, «P
RequestPath = «/proto»
});[/javascript]
Referencia directa al fichero .proto
Una vez realizados los cambios en el servicio gRPC, desde la aplicación cliente, añadimos la referencia de servicio.
Sobre el proyecto hacemos click con el botón derecho y seleccionamos Agregar > Referencias de servicio…
Se maltratará el cuadro de diálogo Agregar referencia de servicio, donde seleccionaremos gRPC y haremos click en el botón Siguiente
En el siguiente paso vamos a tener que hacer referencia al fichero .proto que será el que contenga la definición del servicio así como de los tipos utilizados para el traspaso de información
Podemos elegir entre indicar una localización del fichero .proto, o bien dar una url, de donde se podrá recuperar el fichero .proto
gRPC solamente trabaja con HTTP/2
Hasta aquí quedaría configurado el servicio para poder proporcionar los ficheros .proto a través de una url del estilo:
http://localhost:5172/proto/HelloCommunity.proto
Pero si nosotros le damos esta url desde la aplicación siguiente, obtendremos el siguiente resultado
El problema es que gRPC trabaja con protocolo HTTP/2, y por defecto ese es el único protocolo que soportará el servicio (server side). Para solucionar esto, debemos ir al servicio (server side), y cambiar la configuración de la siguiente forma
[javascript]»AllowedHosts»: «*»,
«Kestrel»: {
«EndpointDefaults»: {
«Protocols»: «Http1AndHttp2»
}
}[/javascript]
Ahora podemos volver a la aplicación cliente, solicitar la url del fichero .proto, y esta vez si obtendremos el resultado deseado.