ASP.NET Core içeren gRPC Hizmetleri
Bu belgede, ASP.NET Core kullanarak gRPC hizmetlerini kullanmaya başlamayı ASP.NET Core.
Uyarı
ASP.NET Core GRPC'nin, Azure App Service IIS ile birlikte Azure App Service gerekir. gRPC'nin nerede kullanılabı hakkında daha fazla bilgi için .NET'de desteklenen platformlarda gRPC bkz. .
Önkoşullar
- ASP.net ve Web geliştirme iş yüküyle Visual Studio 2019
- .NET Core 3,0 SDK
ASP.NET Core’da gRPC hizmeti ile çalışmaya başlama
Örnek kodu görüntüleme veya indirme (indirme).
gRPC Kullanmaya başlayın oluşturma hakkında ayrıntılı yönergeler için bkz. gRPC hizmetleriyle ilgili ayrıntılı yönergeler.
ASP.NET Core uygulamasına gRPC hizmetleri ekleme
gRPC, Grpc.AspNetCore paketini gerektirir.
gRPC'yi yapılandırma
Startup.cs içinde:
- gRPC yöntemiyle
AddGrpcetkinleştirilir. - Her gRPC hizmeti, yöntemi aracılığıyla yönlendirme işlem hattına
MapGrpcServiceeklenir.
public class Startup
{
// This method gets called by the runtime. Use this method to add services to the container.
// For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
public void ConfigureServices(IServiceCollection services)
{
services.AddGrpc();
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseRouting();
app.UseEndpoints(endpoints =>
{
// Communication with gRPC endpoints must be made through a gRPC client.
// To learn how to create a client, visit: https://go.microsoft.com/fwlink/?linkid=2086909
endpoints.MapGrpcService<GreeterService>();
});
}
}
Ingilizce dışındaki dillere çevrilmiş kod açıklamalarını görmek isterseniz, Bu GitHub tartışma sorununubize tanıyın.
ASP.NET Core yazılım ve özellikler yönlendirme işlem hattını paylaşır, bu nedenle bir uygulama ek istek işleyicileri hizmet verecek şekilde yalıtabilirsiniz. MVC denetleyicileri gibi ek istek işleyicileri, yapılandırılmış gRPC hizmetleriyle paralel olarak çalışır.
Sunucu seçenekleri
gRPC hizmetleri tüm yerleşik sunucularda ASP.NET Core barındırabilirsiniz.
- Kestrel
- TestServer
- IIS†
- HTTP.sys‡
†IIS için .NET 5 ve Windows 10 20300.1000 veya sonraki bir derleme gerekir.
‡HTTP.sys 19529 veya Windows 10 .NET 5 ve sonraki bir derleme gerektirir.
Önceki Windows 10 Derleme sürümleri, bir Windows Insider derlemesi gerektirir.
Bir uygulama için doğru sunucuyu seçme hakkında daha fazla bilgi ASP.NET Core bkz. ASP.NET Core'de web sunucusu uygulamaları .
Kestrel
Kestrel, platformlar arası bir web sunucusudur ASP.NET Core. Kestrel en iyi performansı ve bellek kullanımını sağlar, ancak bağlantı noktası paylaşımı gibi gelişmiş HTTP.sys özelliklerine sahip değil.
Kestrel gRPC uç noktaları:
- HTTP/2 gerektir.
- Aktarım Katmanı Güvenliği (TLS) ile güvenli hale getirildi.
HTTP/2
gRPC HTTP/2 gerektirir. ASP.NET Core için gRPC HttpRequest.Protocol olduğunu HTTP/2 doğrular.
Kestrelmodern işletim sistemlerinin çoğunda HTTP/2'i destekler. Kestrel uç noktaları varsayılan olarak HTTP/1.1 ve HTTP/2 bağlantılarını destekleyecek şekilde yapılandırılır.
TLS
Kestrel gRPC için kullanılan uç noktaların güvenliği TLS ile sağlanacak. Geliştirme aşamasında, üzerinde TLS ile güvenliği sağlanacak bir uç nokta, ASP.NET Core https://localhost:5001 sertifikası mevcut olduğunda otomatik olarak oluşturulur. Yapılandırma gerekmez. Ön https ek, uç noktanın Kestrel TLS'yi kullanıyor olduğunu doğrular.
Üretimde TLS'nin açıkça yapılandırılması gerekir. Aşağıdaki appsettings.json örnekte, TLS ile güvenliği sağlanan bir HTTP/2 uç noktası sağlanmıştır:
{
"Kestrel": {
"Endpoints": {
"HttpsInlineCertFile": {
"Url": "https://localhost:5001",
"Protocols": "Http2",
"Certificate": {
"Path": "<path to .pfx file>",
"Password": "<certificate password>"
}
}
}
}
}
Alternatif olarak, Kestrel uç noktalar Program.cs içinde yalıtabilirsiniz:
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.ConfigureKestrel(options =>
{
options.Listen(IPAddress.Any, 5001, listenOptions =>
{
listenOptions.Protocols = HttpProtocols.Http2;
listenOptions.UseHttps("<path to .pfx file>",
"<certificate password>");
});
});
webBuilder.UseStartup<Startup>();
});
ile TLS'yi etkinleştirme hakkında daha fazla bilgi için Kestrel bkz. Kestrel HTTPS uç noktası yapılandırması.
Protokol anlaşması
TLS, iletişimin güvenliğini sağlamaktan daha fazlası için kullanılır. Bir uç nokta birden çok protokolü desteklediği zaman istemci ile sunucu arasındaki bağlantı protokolü üzerinde anlaşmak için TLS Uygulama Katmanı Protokol Anlaşması (ELEN) el sıkışması kullanılır. Bu anlaşma, bağlantının HTTP/1.1 mi yoksa HTTP/2 mi kullandığını belirler.
BIR HTTP/2 uç noktası TLS olmadan yapılandırılmışsa, uç noktanın ListenOptions.Protocols olarak ayarlanmış HttpProtocols.Http2 olmalıdır. Birden çok protokolü olan bir uç nokta (örneğin, ) TLS olmadan kullanılamaz HttpProtocols.Http1AndHttp2 çünkü anlaşma yoktur. Güvenliğiz uç noktayla yapılan tüm bağlantılar varsayılan olarak HTTP/1.1'tir ve gRPC çağrıları başarısız olur.
ile HTTP/2 ve TLS'yi etkinleştirme hakkında daha fazla bilgi için Kestrel bkz. Kestrel uç nokta yapılandırması.
Not
macOS, TLS ile ASP.NET Core gRPC'yi desteklemez. macOS'ta gRPC hizmetlerini başarıyla çalıştırmak için ek yapılandırma gerekir. Daha fazla bilgi için bkz. macOS ASP.NET Core gRPC uygulaması başlatılamadı.
IIS
Internet Information Services (IIS), web uygulamalarını barındırmak için esnek, güvenli ve yönetilebilir bir Web Sunucusudur ve ASP.NET Core. IIS ile gRPC hizmetlerini barındırmak için .NET 5 ve Windows 10 Build 20300.1000 veya sonraki bir gerekir. Bu, Windows Insider derlemesi kullanımını gerektirmektedir.
IIS' nin TLS ve HTTP/2 kullanmak üzere yapılandırılması gerekir. Daha fazla bilgi için bkz. IIS ASP.NET Core HTTP/2 ile yükleme kullanma.
HTTP.sys
HTTP.sys, yalnızca ASP.NET Core çalışan bir web sunucusu Windows. HTTP.sys ile gRPC hizmetlerini barındırmak için .NET 5 ve Windows 10 Build 19529 veya sonraki bir Windows gerekir.
HTTP.sys TLS ve HTTP/2 kullanmak üzere yapılandırıldı. Daha fazla bilgi için bkz.HTTP.sys web sunucusu HTTP/2 desteği.
Kestrel
Kestrel, platformlar arası bir web sunucusudur ASP.NET Core. Kestrel en iyi performansı ve bellek kullanımını sağlar, ancak bağlantı noktası paylaşımı gibi gelişmiş HTTP.sys özelliklerine sahip değil.
Kestrel gRPC uç noktaları:
- HTTP/2 gerektir.
- Aktarım Katmanı Güvenliği (TLS) ile güvenli hale getirildi.
HTTP/2
gRPC HTTP/2 gerektirir. ASP.NET Core için gRPC HttpRequest.Protocol olduğunu HTTP/2 doğrular.
Kestrelmodern işletim sistemlerinin çoğunda HTTP/2'i destekler. Kestrel uç noktaları varsayılan olarak HTTP/1.1 ve HTTP/2 bağlantılarını destekleyecek şekilde yapılandırılır.
TLS
Kestrel gRPC için kullanılan uç noktaların güvenliği TLS ile sağlanacak. Geliştirme aşamasında, üzerinde TLS ile güvenliği sağlanacak bir uç nokta, ASP.NET Core https://localhost:5001 sertifikası mevcut olduğunda otomatik olarak oluşturulur. Yapılandırma gerekmez. Ön https ek, uç noktanın Kestrel TLS'yi kullanıyor olduğunu doğrular.
Üretimde TLS'nin açıkça yapılandırılması gerekir. Aşağıdaki appsettings.json örnekte, TLS ile güvenliği sağlanan bir HTTP/2 uç noktası sağlanmıştır:
{
"Kestrel": {
"Endpoints": {
"HttpsInlineCertFile": {
"Url": "https://localhost:5001",
"Protocols": "Http2",
"Certificate": {
"Path": "<path to .pfx file>",
"Password": "<certificate password>"
}
}
}
}
}
Alternatif olarak, Kestrel uç noktalar Program.cs içinde yalıtabilirsiniz:
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.ConfigureKestrel(options =>
{
options.Listen(IPAddress.Any, 5001, listenOptions =>
{
listenOptions.Protocols = HttpProtocols.Http2;
listenOptions.UseHttps("<path to .pfx file>",
"<certificate password>");
});
});
webBuilder.UseStartup<Startup>();
});
ile TLS'yi etkinleştirme hakkında daha fazla bilgi için Kestrel bkz. Kestrel HTTPS uç noktası yapılandırması.
Protokol anlaşması
TLS, iletişimin güvenliğini sağlamaktan daha fazlası için kullanılır. Bir uç nokta birden çok protokolü desteklediği zaman istemci ile sunucu arasındaki bağlantı protokolü üzerinde anlaşmak için TLS Uygulama Katmanı Protokol Anlaşması (ELEN) el sıkışması kullanılır. Bu anlaşma, bağlantının HTTP/1.1 mi yoksa HTTP/2 mi kullandığını belirler.
BIR HTTP/2 uç noktası TLS olmadan yapılandırılmışsa, uç noktanın ListenOptions.Protocols olarak ayarlanmış HttpProtocols.Http2 olmalıdır. Birden çok protokolü olan bir uç nokta (örneğin, ) TLS olmadan kullanılamaz HttpProtocols.Http1AndHttp2 çünkü anlaşma yoktur. Güvenliğiz uç noktayla yapılan tüm bağlantılar varsayılan olarak HTTP/1.1'tir ve gRPC çağrıları başarısız olur.
ile HTTP/2 ve TLS'yi etkinleştirme hakkında daha fazla bilgi için Kestrel bkz. Kestrel uç nokta yapılandırması.
Not
macOS, TLS ile ASP.NET Core gRPC'yi desteklemez. macOS'ta gRPC hizmetlerini başarıyla çalıştırmak için ek yapılandırma gerekir. daha fazla bilgi için bkz. macos üzerinde grpc uygulaması ASP.NET Core başlatılamıyor.
ASP.NET Core apı 'leri ile tümleştirme
grpc hizmetleri, bağımlılık ekleme (dı) ve günlüğe kaydetmegibi ASP.NET Core özelliklerine tam erişime sahiptir. Örneğin, hizmet uygulama, Oluşturucu aracılığıyla bir günlükçü hizmetini dı kapsayıcısından çözümleyebilir:
public class GreeterService : Greeter.GreeterBase
{
public GreeterService(ILogger<GreeterService> logger)
{
}
}
Varsayılan olarak, gRPC hizmeti uygulama diğer dı hizmetlerini herhangi bir yaşam süresi (tek, kapsamlı veya geçici) ile çözümleyebilir.
GRPC yöntemlerinde HttpContext 'i çözümle
GRPC API 'SI, yöntem, ana bilgisayar, üst bilgi ve tanıtımları gibi bazı HTTP/2 ileti verilerine erişim sağlar. Erişim, ServerCallContext her gRPC yöntemine geçirilen bağımsız değişkendir:
public class GreeterService : Greeter.GreeterBase
{
public override Task<HelloReply> SayHello(
HelloRequest request, ServerCallContext context)
{
return Task.FromResult(new HelloReply
{
Message = "Hello " + request.Name
});
}
}
ServerCallContext``HttpContexttüm ASP.NET apı 'lerinde tam erişim sağlamaz. GetHttpContextuzantı yöntemi, HttpContext ASP.NET apı 'lerinde temel alınan HTTP/2 iletisini temsil eden öğesine tam erişim sağlar:
public class GreeterService : Greeter.GreeterBase
{
public override Task<HelloReply> SayHello(
HelloRequest request, ServerCallContext context)
{
var httpContext = context.GetHttpContext();
var clientCertificate = httpContext.Connection.ClientCertificate;
return Task.FromResult(new HelloReply
{
Message = "Hello " + request.Name + " from " + clientCertificate.Issuer
});
}
}