Použití gRPC v prohlížečových aplikacích

Od James Newton – král

naučte se konfigurovat existující službu ASP.NET Core gRPC, která se má volat z aplikací v prohlížeči, pomocí gRPC webového protokolu. gRPC-web umožňuje prohlížeči JavaScript a Blazor aplikacím volat služby gRPC. Nemůžete volat službu gRPC HTTP/2 z aplikace založené na prohlížeči. služby gRPC hostované v ASP.NET Core můžou být nakonfigurované tak, aby podporovaly gRPC-Web vedle HTTP/2 gRPC.

pokyny k přidání služby gRPC do existující aplikace ASP.NET Core najdete v tématu přidání gRPC services do aplikace ASP.NET Core.

Pokyny k vytvoření projektu gRPC naleznete v tématu Vytvoření klienta a serveru gRPC .NET Core v ASP.NET Core .

gRPC – Web ve ASP.NET Core vs. zástupné

existují dvě možnosti, jak přidat gRPC-Web do aplikace ASP.NET Core:

  • Podpora gRPC-web společně s gRPC HTTP/2 v ASP.NET Core. Tato možnost používá middleware poskytované Grpc.AspNetCore.Web balíčkem.
  • Pomocí gRPC webu zástupné proxy můžete přeložit GRPC-web na gRPC http/2. přeložené volání je pak předáno do aplikace ASP.NET Core.

Existují odborníci a nevýhody pro každý přístup. Pokud prostředí aplikace už používá zástupné jako proxy, může to mít smysl také použít zástupné k poskytování gRPC-web support. pro základní řešení pro gRPC-Web, které vyžaduje jenom ASP.NET Core, Grpc.AspNetCore.Web je vhodná volba.

Konfigurace gRPC-web v ASP.NET Core

služby gRPC hostované v ASP.NET Core můžou být nakonfigurované tak, aby podporovaly gRPC-Web vedle HTTP/2 gRPC. gRPC-web nevyžaduje žádné změny služeb. Jedinou úpravou je spuštění konfigurace.

povolení gRPC-Web pomocí služby ASP.NET Core gRPC:

  • Přidejte odkaz na balíček Grpc. AspNetCore. Web .
  • Nakonfigurujte aplikaci tak, aby používala gRPC-web přidáním UseGrpcWeb a EnableGrpcWeb ke spuštění. cs:
public void ConfigureServices(IServiceCollection services)
{
    services.AddGrpc();
}

public void Configure(IApplicationBuilder app)
{
    app.UseRouting();

    app.UseGrpcWeb(); // Must be added between UseRouting and UseEndpoints

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapGrpcService<GreeterService>().EnableGrpcWeb();
    });
}

Předchozí kód:

  • Přidá gRPC-web middleware, UseGrpcWeb po směrování a před koncovými body.
  • Určuje metodu, která endpoints.MapGrpcService<GreeterService>() podporuje gRPC-web s EnableGrpcWeb .

Případně je možné nakonfigurovat middleware gRPC-web tak, aby všechny služby podporovaly gRPC-web ve výchozím nastavení a EnableGrpcWeb nejsou povinné. Určete, new GrpcWebOptions { DefaultEnabled = true } kdy se má middleware přidat.

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddGrpc();
    }

    public void Configure(IApplicationBuilder app)
    {
        app.UseRouting();

        app.UseGrpcWeb(new GrpcWebOptions { DefaultEnabled = true });

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapGrpcService<GreeterService>();
        });
    }
}

Poznámka

K dispozici je známý problém, který způsobí selhání gRPC-web při hostování HTTP.sys v .NET Core 3. x.

K dispozici jealternativní řešení pro získání GRPC na webu na HTTP.sys.

gRPC – web a CORS

Zabezpečení prohlížeče brání webové stránce v tom, aby prováděla požadavky na jinou doménu než ta, která tuto webovou stránku obsluhoval. Toto omezení se vztahuje k vytváření gRPC webových volání s aplikacemi prohlížeče. Například aplikace prohlížeče obsluhovaná aplikací https://www.contoso.com je blokována při volání gRPCch webových služeb hostovaných na https://services.contoso.com . Pro zmírnění tohoto omezení lze použít sdílení prostředků mezi zdroji (CORS).

Aby mohla aplikace v prohlížeči dělat gRPC webová volání mezi zdroji, nastavte CORS v ASP.NET Core. Využijte integrovanou podporu CORS a vystavte hlavičky specifické pro gRPC WithExposedHeaders .

public void ConfigureServices(IServiceCollection services)
{
    services.AddGrpc();

    services.AddCors(o => o.AddPolicy("AllowAll", builder =>
    {
        builder.AllowAnyOrigin()
               .AllowAnyMethod()
               .AllowAnyHeader()
               .WithExposedHeaders("Grpc-Status", "Grpc-Message", "Grpc-Encoding", "Grpc-Accept-Encoding");
    }));
}

public void Configure(IApplicationBuilder app)
{
    app.UseRouting();

    app.UseGrpcWeb();
    app.UseCors();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapGrpcService<GreeterService>().EnableGrpcWeb()
                                                  .RequireCors("AllowAll");
    });
}

Předchozí kód:

  • Volání AddCors pro přidání služeb CORS a nakonfigurují zásady CORS, které zveřejňují gRPC konkrétní hlavičky.
  • Volání UseCors pro přidání middlewaru CORS po směrování a před koncovými body.
  • Určuje metodu, která endpoints.MapGrpcService<GreeterService>() podporuje CORS s RequiresCors .

gRPC – web a streamování

Tradiční gRPC přes HTTP/2 podporuje streamování ve všech směrech. gRPC – web nabízí omezené podpory pro streamování:

  • gRPC – klienti webového prohlížeče nepodporují volání metod streamování klientů a obousměrného streamování.
  • ASP.NET Core služby gRPC hostované v Azure App Service a IIS nepodporují obousměrný streamování.

Při použití gRPC-web doporučujeme použít jenom unární metody a metody streamování serveru.

Volání gRPC-web z prohlížeče

Aplikace prohlížeče můžou pomocí gRPC-web volat služby gRPC. Existují některé požadavky a omezení při volání služeb gRPC Services pomocí gRPC-web z prohlížeče:

  • Server musí být nakonfigurovaný tak, aby podporoval gRPC-Web.
  • Volání streamování klientů a obousměrného streamování nejsou podporovaná. Streamování serveru je podporované.
  • Volání služeb gRPC Services v jiné doméně vyžaduje, aby na serveru byla nakonfigurovaná CORS .

JavaScript gRPC – webový klient

K dispozici je gRPC JavaScript-Web Client. Pokyny, jak používat gRPC-web z JavaScriptu, najdete v tématu Zápis kódu klienta JavaScript pomocí gRPC-web.

Konfigurace gRPC-web pomocí klienta .NET gRPC

Klient .NET gRPC se dá nakonfigurovat tak, aby gRPC webová volání. To je užitečné pro Blazor WebAssembly aplikace, které jsou hostované v prohlížeči a mají stejná omezení http kódu JavaScriptu. Volání gRPC-web s klientem .NET je stejné jako http/2 gRPC. Jedinou úpravou je způsob vytvoření kanálu.

Použití gRPC-web:

var channel = GrpcChannel.ForAddress("https://localhost:5001", new GrpcChannelOptions
    {
        HttpHandler = new GrpcWebHandler(new HttpClientHandler())
    });

var client = new Greeter.GreeterClient(channel);
var response = await client.SayHelloAsync(new HelloRequest { Name = ".NET" });

Předchozí kód:

  • Nakonfiguruje kanál tak, aby používal gRPC-Web.
  • Vytvoří klienta a provede volání pomocí kanálu.

GrpcWebHandler má následující možnosti konfigurace:

  • InnerHandler: základní HttpMessageHandler , který vytváří požadavek gRPC http, například HttpClientHandler .
  • GrpcWebMode: typ výčtu, který určuje, zda je GRPC požadavek Content-Type http application/grpc-web nebo application/grpc-web-text .
    • GrpcWebMode.GrpcWeb Konfiguruje obsah, který se má odeslat bez kódování. Výchozí hodnota.
    • GrpcWebMode.GrpcWebText Konfiguruje obsah tak, aby byl kódovaný v kódování Base64. Vyžaduje se pro volání streamování serveru v prohlížečích.
  • HttpVersion: protokol HTTP Version použitý k nastavení zprávy HttpRequestMessage. Version na podkladové žádosti HTTP gRPC. gRPC-web nevyžaduje konkrétní verzi a nepřepisuje výchozí, pokud není zadaný.

Důležité

Vygenerované klienty gRPC mají synchronizační a asynchronní metody pro volání unárních metod. Například SayHello je synchronizován a SayHelloAsync je asynchronní. Volání metody synchronizace v Blazor WebAssembly aplikaci způsobí, že aplikace přestane reagovat. Asynchronní metody musí být vždy použity v Blazor WebAssembly .

Použití klienta gRPC Client Factory s gRPC-Web

Klient .NET kompatibilní s gRPC je možné vytvořit pomocí klientské továrny gRPC.

Použití gRPC-web s klientskou továrnou:

  • Přidejte do souboru projektu odkazy balíčků pro následující balíčky:
  • Zaregistrujte klienta gRPC se vkládáním závislostí (DI) pomocí obecné AddGrpcClient metody rozšíření. V Blazor WebAssembly aplikaci jsou služby zaregistrované v di v Program.cs .
  • Nakonfigurujte GrpcWebHandler pomocí ConfigurePrimaryHttpMessageHandler metody rozšíření.
builder.Services
    .AddGrpcClient<Greet.GreeterClient>(options =>
    {
        options.Address = new Uri("https://localhost:5001");
    })
    .ConfigurePrimaryHttpMessageHandler(
        () => new GrpcWebHandler(new HttpClientHandler()));

Další informace naleznete v tématu integrace klientské továrny gRPC v .NET.

Další zdroje informací