Miroslav Holec
Premium

Konfigurace .NET Core gRPC na macOS

Miroslav Holec   21. listopadu 2019

Tento článek je již velmi zastaralý. Článek nemusí popisovat aktuální stav technologie, ideální řešení a můj současný pohled na dané téma.

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).