Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Note
Dit is niet de nieuwste versie van dit artikel. Zie de .NET 9-versie van dit artikel voor de huidige release.
Warning
Deze versie van ASP.NET Core wordt niet meer ondersteund. Zie het .NET- en .NET Core-ondersteuningsbeleid voor meer informatie. Zie de .NET 9-versie van dit artikel voor de huidige release.
Important
Deze informatie heeft betrekking op een pre-releaseproduct dat aanzienlijk kan worden gewijzigd voordat het commercieel wordt uitgebracht. Microsoft geeft geen garanties, uitdrukkelijk of impliciet, met betrekking tot de informatie die hier wordt verstrekt.
Zie de .NET 9-versie van dit artikel voor de huidige release.
Door James Newton-King
Meer informatie over het configureren van een bestaande ASP.NET Core gRPC-service die kan worden aangeroepen vanuit browser-apps met behulp van het gRPC-Web-protocol . met gRPC-Web kunnen Browser JavaScript en Blazor apps gRPC-services aanroepen. Het is niet mogelijk om een HTTP/2 gRPC-service aan te roepen vanuit een browser-app. gRPC-services die worden gehost in ASP.NET Core kunnen worden geconfigureerd ter ondersteuning van gRPC-Web naast HTTP/2 gRPC.
Zie Een .NET gRPC-client en -server maken in ASP.NET Core voor instructies voor het maken van een gRPC-project.
ASP.NET Core gRPC-Web versus Envoy
Er zijn twee opties voor het toevoegen van gRPC-Web aan een ASP.NET Core-app:
- Ondersteuning voor gRPC-Web naast gRPC HTTP/2 in ASP.NET Core. Deze optie maakt gebruik van middleware die door het
Grpc.AspNetCore.Webpakket wordt geleverd. - Gebruik de gRPC-Web-ondersteuning van de Envoy-proxy om gRPC-Web te vertalen naar gRPC HTTP/2. De vertaalde oproep wordt vervolgens doorgestuurd naar de ASP.NET Core-app.
Er zijn voor- en nadelen voor elke benadering. Als de omgeving van een app al Gebruikmaakt van Envoy als proxy, kan het zinvol zijn om ook Envoy te gebruiken om gRPC-Web-ondersteuning te bieden. Voor een basisoplossing voor gRPC-Web waarvoor alleen ASP.NET Core is vereist, Grpc.AspNetCore.Web is dit een goede keuze.
gRPC-Web configureren in ASP.NET Core
gRPC-services die worden gehost in ASP.NET Core kunnen worden geconfigureerd ter ondersteuning van gRPC-Web naast HTTP/2 gRPC. gRPC-Web vereist geen wijzigingen in services. De enige wijziging is het instellen van de middleware in Program.cs.
GRPC-Web inschakelen met een ASP.NET Core gRPC-service:
- Voeg een verwijzing naar het
Grpc.AspNetCore.Webpakket toe. - Configureer de app voor het gebruik van gRPC-Web door toe te voegen
UseGrpcWebenEnableGrpcWebaanProgram.cs:
using GrpcGreeter.Services;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddGrpc();
var app = builder.Build();
app.UseGrpcWeb();
app.MapGrpcService<GreeterService>().EnableGrpcWeb();
app.MapGet("/", () => "This gRPC service is gRPC-Web enabled and is " +
"callable from browser apps using the gRPC-Web protocol");
app.Run();
De voorgaande code:
- Voegt de gRPC-Web-middleware toe,
UseGrpcWebna routering en vóór eindpunten. - Hiermee geeft u op dat de
endpoints.MapGrpcService<GreeterService>()methode gRPC-Web ondersteunt metEnableGrpcWeb.
De gRPC-Web-middleware kan ook worden geconfigureerd, zodat alle services standaard gRPC-Web ondersteunen en EnableGrpcWeb niet vereist zijn. Geef new GrpcWebOptions { DefaultEnabled = true } op wanneer de middleware wordt toegevoegd.
using GrpcGreeter.Services;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddGrpc();
var app = builder.Build();
app.UseGrpcWeb(new GrpcWebOptions { DefaultEnabled = true });
app.MapGrpcService<GreeterService>();
app.MapGet("/", () => "All gRPC service are supported by default in " +
"this example, and are callable from browser apps using the " +
"gRPC-Web protocol");
app.Run();
Note
Er is een bekend probleem waardoor gRPC-Web mislukt wanneer deze wordt gehost door HTTP.sys in .NET Core 3.x.
Een tijdelijke oplossing om gRPC-Web op HTTP.sys te laten werken is beschikbaar in Grpc-web Experimental en UseHttpSys()? (grpc/grpc-dotnet #853).
gRPC-Web en CORS
Browserbeveiliging voorkomt dat een webpagina aanvragen indient naar een ander domein dan het domein dat de webpagina heeft geleverd. Deze beperking geldt voor het maken van gRPC-web-aanroepen met browser-apps. Een browser-app die door https://www.contoso.com wordt aangeboden, wordt bijvoorbeeld geblokkeerd bij het aanroepen van gRPC-Web-services die worden gehost op https://services.contoso.com. CorS (Cross-Origin Resource Sharing) kan worden gebruikt om deze beperking te versoepelen.
Als u wilt toestaan dat een browser-app cross-origin gRPC-Web-aanroepen uitvoert, stelt u CORS in ASP.NET Core in. Gebruik de ingebouwde CORS-ondersteuning en stel gRPC-specifieke headers beschikbaar met WithExposedHeaders.
using GrpcGreeter.Services;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddGrpc();
builder.Services.AddCors(o => o.AddPolicy("AllowAll", builder =>
{
builder.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader()
.WithExposedHeaders("Grpc-Status", "Grpc-Message",
"Grpc-Encoding", "Grpc-Accept-Encoding",
"Grpc-Status-Details-Bin");
}));
var app = builder.Build();
app.UseGrpcWeb();
app.UseCors();
app.MapGrpcService<GreeterService>().EnableGrpcWeb()
.RequireCors("AllowAll");
app.MapGet("/", () => "This gRPC service is gRPC-Web enabled, CORS " +
"enabled, and is callable from browser apps using the gRPC-Web " +
"protocol");
app.Run();
De voorgaande code:
- Aanroepen
AddCorsom CORS-services toe te voegen en een CORS-beleid te configureren waarmee gRPC-specifieke headers worden weergegeven. - Aanroepen
UseCorsom de CORS-middleware toe te voegen na de routeringsconfiguratie en vóór de configuratie van eindpunten. - Hiermee geeft u op dat de
endpoints.MapGrpcService<GreeterService>()methode CORS ondersteunt metRequireCors.
gRPC-Web en streaming
Traditionele gRPC via HTTP/2 ondersteunt client-, server- en bidirectionele streaming. gRPC-Web biedt beperkte ondersteuning voor streaming:
- gRPC-webbrowserclients bieden geen ondersteuning voor het aanroepen van clientstreaming- en bidirectionele streamingmethoden.
- gRPC-Web .NET-clients bieden geen ondersteuning voor het aanroepen van clientstreaming- en bidirectionele streamingmethoden via HTTP/1.1.
- ASP.NET Core gRPC-services die worden gehost in Azure App Service en IIS bieden geen ondersteuning voor bidirectionele streaming.
Wanneer u gRPC-Web gebruikt, raden we u alleen aan om unaire methoden en serverstreamingmethoden te gebruiken.
HTTP protocol
De ASP.NET Core gRPC-servicesjabloon, opgenomen in de .NET SDK, maakt een app die alleen is geconfigureerd voor HTTP/2. Dit is een goede standaardinstelling wanneer een app alleen ondersteuning biedt voor traditionele gRPC via HTTP/2. gRPC-Web werkt echter met zowel HTTP/1.1 als HTTP/2. Sommige platforms, zoals UWP of Unity, kunnen HTTP/2 niet gebruiken. Als u alle client-apps wilt ondersteunen, configureert u de server om HTTP/1.1 en HTTP/2 in te schakelen.
Het standaardprotocol bijwerken in appsettings.json:
{
"Kestrel": {
"EndpointDefaults": {
"Protocols": "Http1AndHttp2"
}
}
}
U kunt ook eindpunten configureren Kestrel in opstartcode.
Voor het inschakelen van HTTP/1.1 en HTTP/2 op dezelfde poort is TLS vereist voor protocolonderhandeling. Zie ASP.NET Core gRPC-protocolonderhandeling voor meer informatie.
GRPC-Web aanroepen vanuit de browser
Browser-apps kunnen gRPC-Web gebruiken om gRPC-services aan te roepen. Er zijn enkele vereisten en beperkingen bij het aanroepen van gRPC-services met gRPC-Web vanuit de browser:
- De server moet configuratie bevatten ter ondersteuning van gRPC-Web.
- Clientstreaming- en bidirectionele streaming-aanroepen worden niet ondersteund. Serverstreaming wordt ondersteund.
- Voor het aanroepen van gRPC-services in een ander domein is CORS-configuratie op de server vereist.
JavaScript gRPC-Web-client
Er bestaat een JavaScript gRPC-webclient. Zie JavaScript-clientcode schrijven met gRPC-Web voor instructies over het gebruik van gRPC-Web vanuit JavaScript.
gRPC-Web configureren met de .NET gRPC-client
De .NET gRPC-client kan worden geconfigureerd om gRPC-web-aanroepen te maken. Dit is handig voor Blazor WebAssembly apps die worden gehost in de browser en dezelfde HTTP-beperkingen van JavaScript-code hebben. Het aanroepen van gRPC-Web met een .NET-client is hetzelfde als HTTP/2 gRPC. De enige wijziging is hoe het kanaal wordt gemaakt.
GRPC-Web gebruiken:
- Voeg een verwijzing naar het
Grpc.Net.Client.Webpakket toe. - Zorg ervoor dat de verwijzing naar
Grpc.Net.Clientpakket versie 2.29.0 of hoger is. - Configureer het kanaal om de
GrpcWebHandlerte gebruiken:
var channel = GrpcChannel.ForAddress("https://localhost:53305", new GrpcChannelOptions
{
HttpHandler = new GrpcWebHandler(new HttpClientHandler())
});
var client = new Greeter.GreeterClient(channel);
var response = await client.SayHelloAsync(
new HelloRequest { Name = "GreeterClient" });
De voorgaande code:
- Hiermee configureert u een kanaal voor het gebruik van gRPC-Web.
- Maakt een client aan en voert een aanroep uit via het kanaal.
GrpcWebHandler heeft de volgende configuratieopties:
-
InnerHandler: Het onderliggende systeem HttpMessageHandler dat de gRPC HTTP-aanvraag uitvoert, bijvoorbeeldHttpClientHandler. -
GrpcWebMode: een opsommingstype dat aangeeft of de gRPC HTTP-aanvraagContent-Typeisapplication/grpc-webofapplication/grpc-web-text.-
GrpcWebMode.GrpcWebhiermee configureert u het verzenden van inhoud zonder codering. Default value. -
GrpcWebMode.GrpcWebTextconfigureert base64-gecodeerde inhoud. Vereist voor serverstreaming-aanroepen in browsers.
-
GrpcChannelOptions.HttpVersion en GrpcChannelOptions.HttpVersionPolicy kan worden gebruikt om de HTTP-protocolversie te configureren.
Important
Gegenereerde gRPC-clients hebben synchrone en asynchrone methoden voor het aanroepen van unaire methoden. Bijvoorbeeld, SayHello is synchroon en SayHelloAsync is asynchroon. Asynchrone methoden zijn altijd vereist in Blazor WebAssembly. Als u een synchrone methode in een Blazor WebAssembly app aanroept, reageert de app niet meer.
Gebruik de gRPC Client Factory met gRPC-Web
Maak een .NET-client die compatibel is met gRPC-Web met behulp van de gRPC-clientfactory:
- Voeg pakketverwijzingen toe aan het projectbestand voor de volgende pakketten:
- Registreer een gRPC-client met afhankelijkheidsinjectie (DI) met behulp van de algemene
AddGrpcClientextensiemethode. In een Blazor WebAssembly-app worden services bij de DI geregistreerd inProgram.cs. - Configureer
GrpcWebHandlermet behulp van de ConfigurePrimaryHttpMessageHandler extensiemethode.
builder.Services
.AddGrpcClient<Greet.GreeterClient>(options =>
{
options.Address = new Uri("https://localhost:5001");
})
.ConfigurePrimaryHttpMessageHandler(
() => new GrpcWebHandler(new HttpClientHandler()));
Voor meer informatie, zie gRPC-clientfactory-integratie in .NET.
Additional resources
Meer informatie over het configureren van een bestaande ASP.NET Core gRPC-service die kan worden aangeroepen vanuit browser-apps met behulp van het gRPC-Web-protocol . met gRPC-Web kunnen Browser JavaScript en Blazor apps gRPC-services aanroepen. Het is niet mogelijk om een HTTP/2 gRPC-service aan te roepen vanuit een browser-app. gRPC-services die worden gehost in ASP.NET Core kunnen worden geconfigureerd ter ondersteuning van gRPC-Web naast HTTP/2 gRPC.
Zie Een .NET gRPC-client en -server maken in ASP.NET Core voor instructies voor het maken van een gRPC-project.
Vergelijking van ASP.NET Core gRPC-Web en Envoy
Er zijn twee opties voor het toevoegen van gRPC-Web aan een ASP.NET Core-app:
- Ondersteuning voor gRPC-Web naast gRPC HTTP/2 in ASP.NET Core. Deze optie maakt gebruik van middleware die door het
Grpc.AspNetCore.Webpakket wordt geleverd. - Gebruik de gRPC-Web-ondersteuning van de Envoy-proxy om gRPC-Web te vertalen naar gRPC HTTP/2. De vertaalde oproep wordt vervolgens doorgestuurd naar de ASP.NET Core-app.
Er zijn voor- en nadelen voor elke benadering. Als de omgeving van een app al Gebruikmaakt van Envoy als proxy, kan het zinvol zijn om ook Envoy te gebruiken om gRPC-Web-ondersteuning te bieden. Voor een basisoplossing voor gRPC-Web waarvoor alleen ASP.NET Core is vereist, Grpc.AspNetCore.Web is dit een goede keuze.
gRPC-Web configureren in ASP.NET Core
gRPC-services die worden gehost in ASP.NET Core kunnen worden geconfigureerd ter ondersteuning van gRPC-Web naast HTTP/2 gRPC. gRPC-Web vereist geen wijzigingen in services. De enige wijziging is het instellen van de middleware in Program.cs.
GRPC-Web inschakelen met een ASP.NET Core gRPC-service:
- Voeg een verwijzing naar het
Grpc.AspNetCore.Webpakket toe. - Configureer de app voor het gebruik van gRPC-Web door toe te voegen
UseGrpcWebenEnableGrpcWebaanProgram.cs:
using GrpcGreeter.Services;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddGrpc();
var app = builder.Build();
app.UseGrpcWeb();
app.MapGrpcService<GreeterService>().EnableGrpcWeb();
app.MapGet("/", () => "This gRPC service is gRPC-Web enabled and is callable from browser apps using the gRPC-Web protocol");
app.Run();
De voorgaande code:
- Voegt de gRPC-Web-middleware toe,
UseGrpcWebna routering en vóór eindpunten. - Hiermee geeft u op dat de
endpoints.MapGrpcService<GreeterService>()methode gRPC-Web ondersteunt metEnableGrpcWeb.
De gRPC-Web-middleware kan ook worden geconfigureerd, zodat alle services standaard gRPC-Web ondersteunen en EnableGrpcWeb niet vereist zijn. Geef new GrpcWebOptions { DefaultEnabled = true } op wanneer de middleware wordt toegevoegd.
using GrpcGreeter.Services;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddGrpc();
var app = builder.Build();
app.UseGrpcWeb(new GrpcWebOptions { DefaultEnabled = true });
app.MapGrpcService<GreeterService>();
app.MapGet("/", () => "All gRPC service are supported by default in " +
"this example, and are callable from browser apps using the " +
"gRPC-Web protocol");
app.Run();
Note
Er is een bekend probleem waardoor gRPC-Web mislukt wanneer deze wordt gehost door HTTP.sys in .NET Core 3.x.
Een tijdelijke oplossing om gRPC-Web op HTTP.sys te laten werken is beschikbaar in Grpc-web Experimental en UseHttpSys()? (grpc/grpc-dotnet #853).
gRPC-Web en CORS
Browserbeveiliging voorkomt dat een webpagina aanvragen indient naar een ander domein dan het domein dat de webpagina heeft geleverd. Deze beperking geldt voor het maken van gRPC-web-aanroepen met browser-apps. Een browser-app die door https://www.contoso.com wordt aangeboden, wordt bijvoorbeeld geblokkeerd bij het aanroepen van gRPC-Web-services die worden gehost op https://services.contoso.com. CorS (Cross-Origin Resource Sharing) kan worden gebruikt om deze beperking te versoepelen.
Als u wilt toestaan dat een browser-app cross-origin gRPC-Web-aanroepen uitvoert, stelt u CORS in ASP.NET Core in. Gebruik de ingebouwde CORS-ondersteuning en stel gRPC-specifieke headers beschikbaar met WithExposedHeaders.
using GrpcGreeter.Services;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddGrpc();
builder.Services.AddCors(o => o.AddPolicy("AllowAll", builder =>
{
builder.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader()
.WithExposedHeaders("Grpc-Status", "Grpc-Message",
"Grpc-Encoding", "Grpc-Accept-Encoding",
"Grpc-Status-Details-Bin");
}));
var app = builder.Build();
app.UseGrpcWeb();
app.UseCors();
app.MapGrpcService<GreeterService>().EnableGrpcWeb()
.RequireCors("AllowAll");
app.MapGet("/", () => "This gRPC service is gRPC-Web enabled, CORS " +
"enabled, and is callable from browser apps using the gRPC-Web " +
"protocol");
app.Run();
De voorgaande code:
- Aanroepen
AddCorsom CORS-services toe te voegen en een CORS-beleid te configureren waarmee gRPC-specifieke headers worden weergegeven. - Aanroepen
UseCorsom de CORS-middleware toe te voegen na de routeringsconfiguratie en vóór de configuratie van eindpunten. - Hiermee geeft u op dat de
endpoints.MapGrpcService<GreeterService>()methode CORS ondersteunt metRequireCors.
gRPC-Web en streaming
Traditionele gRPC via HTTP/2 ondersteunt client-, server- en bidirectionele streaming. gRPC-Web biedt beperkte ondersteuning voor streaming:
- gRPC-webbrowserclients bieden geen ondersteuning voor het aanroepen van clientstreaming- en bidirectionele streamingmethoden.
- gRPC-Web .NET-clients bieden geen ondersteuning voor het aanroepen van clientstreaming- en bidirectionele streamingmethoden via HTTP/1.1.
- ASP.NET Core gRPC-services die worden gehost in Azure App Service en IIS bieden geen ondersteuning voor bidirectionele streaming.
Wanneer u gRPC-Web gebruikt, raden we u alleen aan om unaire methoden en serverstreamingmethoden te gebruiken.
HTTP protocol
De ASP.NET Core gRPC-servicesjabloon, opgenomen in de .NET SDK, maakt een app die alleen is geconfigureerd voor HTTP/2. Dit is een goede standaardinstelling wanneer een app alleen ondersteuning biedt voor traditionele gRPC via HTTP/2. gRPC-Web werkt echter met zowel HTTP/1.1 als HTTP/2. Sommige platforms, zoals UWP of Unity, kunnen HTTP/2 niet gebruiken. Als u alle client-apps wilt ondersteunen, configureert u de server om HTTP/1.1 en HTTP/2 in te schakelen.
Het standaardprotocol bijwerken in appsettings.json:
{
"Kestrel": {
"EndpointDefaults": {
"Protocols": "Http1AndHttp2"
}
}
}
U kunt ook eindpunten configureren Kestrel in opstartcode.
Voor het inschakelen van HTTP/1.1 en HTTP/2 op dezelfde poort is TLS vereist voor protocolonderhandeling. Zie ASP.NET Core gRPC-protocolonderhandeling voor meer informatie.
GRPC-Web aanroepen vanuit de browser
Browser-apps kunnen gRPC-Web gebruiken om gRPC-services aan te roepen. Er zijn enkele vereisten en beperkingen bij het aanroepen van gRPC-services met gRPC-Web vanuit de browser:
- De server moet configuratie bevatten ter ondersteuning van gRPC-Web.
- Clientstreaming- en bidirectionele streaming-aanroepen worden niet ondersteund. Serverstreaming wordt ondersteund.
- Voor het aanroepen van gRPC-services in een ander domein is CORS-configuratie op de server vereist.
JavaScript gRPC-Web-client
Er bestaat een JavaScript gRPC-webclient. Zie JavaScript-clientcode schrijven met gRPC-Web voor instructies over het gebruik van gRPC-Web vanuit JavaScript.
gRPC-Web configureren met de .NET gRPC-client
De .NET gRPC-client kan worden geconfigureerd om gRPC-web-aanroepen te maken. Dit is handig voor Blazor WebAssembly apps die worden gehost in de browser en dezelfde HTTP-beperkingen van JavaScript-code hebben. Het aanroepen van gRPC-Web met een .NET-client is hetzelfde als HTTP/2 gRPC. De enige wijziging is hoe het kanaal wordt gemaakt.
GRPC-Web gebruiken:
- Voeg een verwijzing naar het
Grpc.Net.Client.Webpakket toe. - Zorg ervoor dat de verwijzing naar
Grpc.Net.Clientpakket versie 2.29.0 of hoger is. - Configureer het kanaal om de
GrpcWebHandlerte gebruiken:
var channel = GrpcChannel.ForAddress("https://localhost:53305", new GrpcChannelOptions
{
HttpHandler = new GrpcWebHandler(new HttpClientHandler())
});
var client = new Greeter.GreeterClient(channel);
var response = await client.SayHelloAsync(
new HelloRequest { Name = "GreeterClient" });
De voorgaande code:
- Hiermee configureert u een kanaal voor het gebruik van gRPC-Web.
- Maakt een client aan en voert een aanroep uit via het kanaal.
GrpcWebHandler heeft de volgende configuratieopties:
-
InnerHandler: Het onderliggende systeem HttpMessageHandler dat de gRPC HTTP-aanvraag uitvoert, bijvoorbeeldHttpClientHandler. -
GrpcWebMode: een opsommingstype dat aangeeft of de gRPC HTTP-aanvraagContent-Typeisapplication/grpc-webofapplication/grpc-web-text.-
GrpcWebMode.GrpcWebhiermee configureert u het verzenden van inhoud zonder codering. Default value. -
GrpcWebMode.GrpcWebTextconfigureert base64-gecodeerde inhoud. Vereist voor serverstreaming-aanroepen in browsers.
-
-
HttpVersion: HTTP-protocolVersiondat wordt gebruikt om in te stellen HttpRequestMessage.Version op de onderliggende gRPC HTTP-aanvraag. gRPC-Web vereist geen specifieke versie en overschrijft de standaardwaarde niet, tenzij opgegeven.
Important
Gegenereerde gRPC-clients hebben synchrone en asynchrone methoden voor het aanroepen van unaire methoden. Bijvoorbeeld, SayHello is synchroon en SayHelloAsync is asynchroon. Asynchrone methoden zijn altijd vereist in Blazor WebAssembly. Als u een synchrone methode in een Blazor WebAssembly app aanroept, reageert de app niet meer.
Gebruik de gRPC Client Factory met gRPC-Web
Maak een .NET-client die compatibel is met gRPC-Web met behulp van de gRPC-clientfactory:
- Voeg pakketverwijzingen toe aan het projectbestand voor de volgende pakketten:
- Registreer een gRPC-client met afhankelijkheidsinjectie (DI) met behulp van de algemene
AddGrpcClientextensiemethode. In een Blazor WebAssembly-app worden services bij de DI geregistreerd inProgram.cs. - Configureer
GrpcWebHandlermet behulp van de ConfigurePrimaryHttpMessageHandler extensiemethode.
builder.Services
.AddGrpcClient<Greet.GreeterClient>(options =>
{
options.Address = new Uri("https://localhost:5001");
})
.ConfigurePrimaryHttpMessageHandler(
() => new GrpcWebHandler(new HttpClientHandler()));
Voor meer informatie, zie gRPC-clientfactory-integratie in .NET.
Additional resources
Meer informatie over het configureren van een bestaande ASP.NET Core gRPC-service die kan worden aangeroepen vanuit browser-apps met behulp van het gRPC-Web-protocol . met gRPC-Web kunnen Browser JavaScript en Blazor apps gRPC-services aanroepen. Het is niet mogelijk om een HTTP/2 gRPC-service aan te roepen vanuit een browser-app. gRPC-services die worden gehost in ASP.NET Core kunnen worden geconfigureerd ter ondersteuning van gRPC-Web naast HTTP/2 gRPC.
Zie Een .NET gRPC-client en -server maken in ASP.NET Core voor instructies voor het maken van een gRPC-project.
ASP.NET Core gRPC-Web versus Envoy
Er zijn twee opties voor het toevoegen van gRPC-Web aan een ASP.NET Core-app:
- Ondersteuning voor gRPC-Web naast gRPC HTTP/2 in ASP.NET Core. Deze optie maakt gebruik van middleware die door het
Grpc.AspNetCore.Webpakket wordt geleverd. - Gebruik de gRPC-Web-ondersteuning van de Envoy-proxy om gRPC-Web te vertalen naar gRPC HTTP/2. De vertaalde oproep wordt vervolgens doorgestuurd naar de ASP.NET Core-app.
Er zijn voor- en nadelen voor elke benadering. Als de omgeving van een app al Gebruikmaakt van Envoy als proxy, kan het zinvol zijn om ook Envoy te gebruiken om gRPC-Web-ondersteuning te bieden. Voor een basisoplossing voor gRPC-Web waarvoor alleen ASP.NET Core is vereist, Grpc.AspNetCore.Web is dit een goede keuze.
gRPC-Web configureren in ASP.NET Core
gRPC-services die worden gehost in ASP.NET Core kunnen worden geconfigureerd ter ondersteuning van gRPC-Web naast HTTP/2 gRPC. gRPC-Web vereist geen wijzigingen in services. De enige wijziging is opstartconfiguratie.
GRPC-Web inschakelen met een ASP.NET Core gRPC-service:
- Voeg een verwijzing naar het
Grpc.AspNetCore.Webpakket toe. - Configureer de app voor het gebruik van gRPC-Web door toe te voegen
UseGrpcWebenEnableGrpcWebaanStartup.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();
});
}
De voorgaande code:
- Voegt de gRPC-Web-middleware toe,
UseGrpcWebna routering en vóór eindpunten. - Hiermee geeft u op dat de
endpoints.MapGrpcService<GreeterService>()methode gRPC-Web ondersteunt metEnableGrpcWeb.
De gRPC-Web-middleware kan ook worden geconfigureerd, zodat alle services standaard gRPC-Web ondersteunen en EnableGrpcWeb niet vereist zijn. Geef new GrpcWebOptions { DefaultEnabled = true } op wanneer de middleware wordt toegevoegd.
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>();
});
}
}
Note
Er is een bekend probleem waardoor gRPC-Web mislukt wanneer deze wordt gehost door HTTP.sys in .NET Core 3.x.
Een tijdelijke oplossing om gRPC-Web op HTTP.sys te laten werken is beschikbaar in Grpc-web Experimental en UseHttpSys()? (grpc/grpc-dotnet #853).
gRPC-Web en CORS
Browserbeveiliging voorkomt dat een webpagina aanvragen indient naar een ander domein dan het domein dat de webpagina heeft geleverd. Deze beperking geldt voor het maken van gRPC-web-aanroepen met browser-apps. Een browser-app die door https://www.contoso.com wordt aangeboden, wordt bijvoorbeeld geblokkeerd bij het aanroepen van gRPC-Web-services die worden gehost op https://services.contoso.com. CorS (Cross-Origin Resource Sharing) kan worden gebruikt om deze beperking te versoepelen.
Als u wilt toestaan dat een browser-app cross-origin gRPC-Web-aanroepen uitvoert, stelt u CORS in ASP.NET Core in. Gebruik de ingebouwde CORS-ondersteuning en stel gRPC-specifieke headers beschikbaar met 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");
});
}
De voorgaande code:
- Aanroepen
AddCorsom CORS-services toe te voegen en een CORS-beleid te configureren waarmee gRPC-specifieke headers worden weergegeven. - Aanroepen
UseCorsom de CORS-middleware toe te voegen na de routeringsconfiguratie en vóór de configuratie van eindpunten. - Hiermee geeft u op dat de
endpoints.MapGrpcService<GreeterService>()methode CORS ondersteunt metRequireCors.
gRPC-Web en streaming
Traditionele gRPC via HTTP/2 ondersteunt client-, server- en bidirectionele streaming. gRPC-Web biedt beperkte ondersteuning voor streaming:
- gRPC-webbrowserclients bieden geen ondersteuning voor het aanroepen van clientstreaming- en bidirectionele streamingmethoden.
- gRPC-Web .NET-clients bieden geen ondersteuning voor het aanroepen van clientstreaming- en bidirectionele streamingmethoden via HTTP/1.1.
- ASP.NET Core gRPC-services die worden gehost in Azure App Service en IIS bieden geen ondersteuning voor bidirectionele streaming.
Wanneer u gRPC-Web gebruikt, raden we u alleen aan om unaire methoden en serverstreamingmethoden te gebruiken.
HTTP protocol
De ASP.NET Core gRPC-servicesjabloon, opgenomen in de .NET SDK, maakt een app die alleen is geconfigureerd voor HTTP/2. Dit is een goede standaardinstelling wanneer een app alleen ondersteuning biedt voor traditionele gRPC via HTTP/2. gRPC-Web werkt echter met zowel HTTP/1.1 als HTTP/2. Sommige platforms, zoals UWP of Unity, kunnen HTTP/2 niet gebruiken. Als u alle client-apps wilt ondersteunen, configureert u de server om HTTP/1.1 en HTTP/2 in te schakelen.
Het standaardprotocol bijwerken in appsettings.json:
{
"Kestrel": {
"EndpointDefaults": {
"Protocols": "Http1AndHttp2"
}
}
}
U kunt ook eindpunten configureren Kestrel in opstartcode.
Voor het inschakelen van HTTP/1.1 en HTTP/2 op dezelfde poort is TLS vereist voor protocolonderhandeling. Zie ASP.NET Core gRPC-protocolonderhandeling voor meer informatie.
GRPC-Web aanroepen vanuit de browser
Browser-apps kunnen gRPC-Web gebruiken om gRPC-services aan te roepen. Er zijn enkele vereisten en beperkingen bij het aanroepen van gRPC-services met gRPC-Web vanuit de browser:
- De server moet configuratie bevatten ter ondersteuning van gRPC-Web.
- Clientstreaming- en bidirectionele streaming-aanroepen worden niet ondersteund. Serverstreaming wordt ondersteund.
- Voor het aanroepen van gRPC-services in een ander domein is CORS-configuratie op de server vereist.
JavaScript gRPC-Web-client
Er bestaat een JavaScript gRPC-webclient. Zie JavaScript-clientcode schrijven met gRPC-Web voor instructies over het gebruik van gRPC-Web vanuit JavaScript.
gRPC-Web configureren met de .NET gRPC-client
De .NET gRPC-client kan worden geconfigureerd om gRPC-web-aanroepen te maken. Dit is handig voor Blazor WebAssembly apps die worden gehost in de browser en dezelfde HTTP-beperkingen van JavaScript-code hebben. Het aanroepen van gRPC-Web met een .NET-client is hetzelfde als HTTP/2 gRPC. De enige wijziging is hoe het kanaal wordt gemaakt.
GRPC-Web gebruiken:
- Voeg een verwijzing naar het
Grpc.Net.Client.Webpakket toe. - Zorg ervoor dat de verwijzing naar
Grpc.Net.Clientpakket versie 2.29.0 of hoger is. - Configureer het kanaal om de
GrpcWebHandlerte gebruiken:
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" });
De voorgaande code:
- Hiermee configureert u een kanaal voor het gebruik van gRPC-Web.
- Maakt een client aan en voert een aanroep uit via het kanaal.
GrpcWebHandler heeft de volgende configuratieopties:
-
InnerHandler: Het onderliggende systeem HttpMessageHandler dat de gRPC HTTP-aanvraag uitvoert, bijvoorbeeldHttpClientHandler. -
GrpcWebMode: een opsommingstype dat aangeeft of de gRPC HTTP-aanvraagContent-Typeisapplication/grpc-webofapplication/grpc-web-text.-
GrpcWebMode.GrpcWebhiermee configureert u het verzenden van inhoud zonder codering. Default value. -
GrpcWebMode.GrpcWebTextconfigureert base64-gecodeerde inhoud. Vereist voor serverstreaming-aanroepen in browsers.
-
-
HttpVersion: HTTP-protocolVersiondat wordt gebruikt om in te stellen HttpRequestMessage.Version op de onderliggende gRPC HTTP-aanvraag. gRPC-Web vereist geen specifieke versie en overschrijft de standaardwaarde niet, tenzij opgegeven.
Important
Gegenereerde gRPC-clients hebben synchrone en asynchrone methoden voor het aanroepen van unaire methoden. Bijvoorbeeld, SayHello is synchroon en SayHelloAsync is asynchroon. Asynchrone methoden zijn altijd vereist in Blazor WebAssembly. Als u een synchrone methode in een Blazor WebAssembly app aanroept, reageert de app niet meer.
Gebruik de gRPC Client Factory met gRPC-Web
Maak een .NET-client die compatibel is met gRPC-Web met behulp van de gRPC-clientfactory:
- Voeg pakketverwijzingen toe aan het projectbestand voor de volgende pakketten:
- Registreer een gRPC-client met afhankelijkheidsinjectie (DI) met behulp van de algemene
AddGrpcClientextensiemethode. In een Blazor WebAssembly-app worden services bij de DI geregistreerd inProgram.cs. - Configureer
GrpcWebHandlermet behulp van de ConfigurePrimaryHttpMessageHandler extensiemethode.
builder.Services
.AddGrpcClient<Greet.GreeterClient>(options =>
{
options.Address = new Uri("https://localhost:5001");
})
.ConfigurePrimaryHttpMessageHandler(
() => new GrpcWebHandler(new HttpClientHandler()));
Voor meer informatie, zie gRPC-clientfactory-integratie in .NET.