Konfigurace .NET Core gRPC na macOS

Miroslav Holec

Miroslav Holec

21. listopadu. 2019

Od verze ASP.NET Core 3.0 mají vývojáři k dispozici nový typ projektů gRPC, který ideově nahrazuje WCFkové služby, které už se v .NET Core netěší podpoře. Chcete-li gRPC služby vyvíjet na macOS, narazíte na menší nepříjemnosti, které se dají naštěstí jednoduše napravit.

Potíže s podporou TLS

Šablona gRPC projektu je nakonfigurována tak, že automaticky používá HTTP/2 společně s kryptografickým protokolem TLS. Kestrel ale v případě macOS a některých starších verzí Windows (např.: Windows 7) nepodporuje HTTP/2 s TLS. Konkrétně na macOS chybí podpora ALPN (rozšíření TLS). Na macOS se setkáte s hláškou:

Unable to bind to https://localhost:5001 on the IPv4 loopback interface: 'HTTP/2 over TLS is not supported on macOS due to missing ALPN support.'.

Konfigurace serverové části

V rámci vývojářského prostředí tedy potřebujeme Kestrel nakonfigurovat tak, aby používal HTTP/2 bez TLS. Upravený Program.cs serverové části služby tedy může vypadat následovně:

public class Program
{
    public static void Main(string[] args)
    {
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults((webBuilder) =>
            {
                webBuilder.UseStartup<Startup>();
                webBuilder.ConfigureKestrel((host, options) =>
                {
                    if (host.HostingEnvironment.IsDevelopment())
                    {
                        options.ListenLocalhost(5000, o => o.Protocols = HttpProtocols.Http2);
                    }
                });
            })
            .Build()
            .Run();
    }
}

Konfigurace klientské části

Stejným způsobem je potřeba upravit klientskou aplikaci. Pro tento účel stačí switchnout konfiguraci před vytvořením GrpcChannelu nebo HttpClienta. Komunikace probíhá na portu 5000, který jsem definoval na serverové části.

AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true);
var channel = GrpcChannel.ForAddress("http://localhost:5000");
var client = new Greet.GreeterClient(channel);

Podpora Protobuf v JetBrains Rider

Komunikace gRPC služeb je založena na Protocal Buffers. Jestliže pro vývoj aplikací používáte Rider, mohu za sebe doporučit osvědčené rozšíření Protobuf Support, které přidává Rideru podporu pro Proto3. Nepříjemné je, že zatím není nikde vidět automaticky generovaný server / client code a do vygenerovaného cs file se lze odnavigovat jen přes referenci (auto decompile dll).

TOP Termíny školení

ASP.NET Core se dočkal již své třetí verze a nabízí řadu možností pro vývoj webových aplikací a služeb. I v roce 2020 mám vypsané termíny na nejrůznější témata od základů .NET Core přes vývoj REST API až po mikroslužby pomocí gRPC.

Termín Místo
🍀 Novinky a změny v ASP.NET Core 3.x leden 2020 Praha více
🍀 Vývoj REST API v .NET Core (třídenní) leden 2020 Praha více
🍀 Vývoj aplikací v ASP.NET Core březen 2020 Praha více
🍀 Microservices v ASP.NET Core gRPC březen 2020 Praha více
🍀 Vývoj REST API v .NET Core (dvoudenní) březen 2020 Praha více
🍀 Tipy a triky pro ASP.NET Core březen 2020 Praha více

👨‍🎓 Čerstvé školení 2020
👍 Vývoj aplikací v ASP.NET Core
👍 Vývoj REST služeb v .NET Core
👍 Microservices v ASP.NET Core gRPC
👍 Tipy a triky v ASP.NET Core
👍 Změny v ASP.NET Core 3.x