Použití gRPC v prohlížečových aplikacích
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.Webbalíč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
UseGrpcWebaEnableGrpcWebke 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,
UseGrpcWebpo směrování a před koncovými body. - Určuje metodu, která
endpoints.MapGrpcService<GreeterService>()podporuje gRPC-web sEnableGrpcWeb.
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í
AddCorspro přidání služeb CORS a nakonfigurují zásady CORS, které zveřejňují gRPC konkrétní hlavičky. - Volání
UseCorspro přidání middlewaru CORS po směrování a před koncovými body. - Určuje metodu, která
endpoints.MapGrpcService<GreeterService>()podporuje CORS sRequiresCors.
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:
- Přidejte odkaz na balíček Grpc .NET. Client. Web .
- Zajistěte, aby byl odkaz na balíček Grpc .NET. Client 2.29.0 nebo vyšší.
- Nakonfigurujte kanál tak, aby používal
GrpcWebHandler:
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-Typehttpapplication/grpc-webneboapplication/grpc-web-text.GrpcWebMode.GrpcWebKonfiguruje obsah, který se má odeslat bez kódování. Výchozí hodnota.GrpcWebMode.GrpcWebTextKonfiguruje 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
Versionpouž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é
AddGrpcClientmetody rozšíření. V Blazor WebAssembly aplikaci jsou služby zaregistrované v di vProgram.cs. - Nakonfigurujte
GrpcWebHandlerpomocí 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.