Slovenská verzeSlovensky

Konfigurace .NET Core gRPC na macOS

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.

Miroslav Holec

Miroslav Holec

21. listopadu. 2019

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


👨‍🎓 Webináře pro vývojáře

Vzdělávat se můžete i z pohodlí domova. Klasická školení jsem doplnil o související témata, která si můžete poslechnout v podobě živých webinářů. Přidejte se téměř 200 vývojářům, kteří se již připojili k mým webinářům!

Termín Místo
🍀 Konzumace REST API v .NET Core červen 2020 on-line více
🍀 Nástroje a šablony projektů v .NET Core červen 2020 on-line více
🍀 Entity Framework Core červen 2020 on-line více
Loading
Otevřít chat