Exposing proto files in a gRPC service over a frameworkless and lightweight API
Introduction
A few days ago I introduced the notion of nano service in ASP.NET Core or rather how to implement a REST API without any particular framework (https://anthonygiretti.com/2020/06/29/nano-services-with-asp-net-core-or-how-to-build-a-light-api/). Since then, I have challenged myself regularly on the possibilities of relevant applications of this idea. Well, I found a very interesting use case: exposing the protobuffs of a gRPC service without using a framework and having to manage collisions with the gRPC framework of ASP.NET Core. This article will show you how to do it in the simplest way possible.
Implementing a ProtoService
Well, in order to make a clearer code, I have implemented a service (then unit testable) instead of writing the whole implementation in the Startup.cs file. The way I implement it (fetching files in the constructor) it’s because I will use Singleton lifetime of ASP.NET Core DI system and let it manage the my service instance, I could have implemented myself a thread safe constructor. Implementation of the ProtoService:
Once done we can instantiate the service in the Starup.cs file and expose endpoints.
Exposing endpoints
I’m expising here 2 endpoints:
- GET /protos that provides a json collection of protobuf files grouped version with the WriteAsync extension.
- GET /protos/v{version:int}/{protoName} that provides the protobuf file in text format with the SendFileAsync extension.
After route parameters conversion to their right type, the Startup file looks like this:
Demo: