ASP.NET Core: Dịch vụ gRPC với ASP.NET Core
Trong bài viết này
- Điều kiện tiên quyết
- Bắt đầu với dịch vụ gRPC trong ASP.NET Core
- Thêm dịch vụ gRPC vào ứng dụng ASP.NET Core
- Tùy chọn máy chủ
- Kestrel
- IIS
- HTTP.sys
- Lưu trữ gRPC trong các dự án không phải ASP.NET Core
- Tích hợp với API ASP.NET Core
- Tài nguyên bổ sung
Bài viết này chỉ ra cách bắt đầu với các dịch vụ gRPC bằng ASP.NET Core.
Điều kiện tiên quyết
Visual Studio 2022 có cài đặt ASP.NET and web development.
Bắt đầu với dịch vụ gRPC trong ASP.NET Core
Xem hoặc tải xuống code mẫu ( cách tải xuống ).
Xem Bắt đầu với các dịch vụ gRPC để biết hướng dẫn chi tiết về cách tạo dự án gRPC.
Thêm dịch vụ gRPC vào ứng dụng ASP.NET Core
gRPC yêu cầu gói Grpc.AspNetCore.
Định cấu hình gRPC
Trong Program.cs
:
- gRPC được kích hoạt bằng phương thức
AddGrpc
. - Mỗi dịch vụ gRPC được thêm vào quy trình định tuyến thông qua phương thức
MapGrpcService
.
using GrpcGreeter.Services;
var builder = WebApplication.CreateBuilder(args);
// Cần có cấu hình bổ sung để chạy thành công gRPC trên macOS.
// Để biết hướng dẫn về cách cấu hình máy khách Kestrel và gRPC trên macOS,
// hãy truy cập https://go.microsoft.com/fwlink/?linkid=2099682
// Thêm dịch vụ vào container.
builder.Services.AddGrpc();
var app = builder.Build();
// Định cấu hình đường dẫn yêu cầu HTTP.
app.MapGrpcService<GreeterService>();
app.MapGet("/", () => "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");
app.Run();
Nếu bạn muốn xem các nhận xét về mã được dịch sang các ngôn ngữ khác ngoài tiếng Anh, hãy cho chúng tôi biết trong vấn đề thảo luận GitHub này.
Middleware và các tính năng của ASP.NET Core chia sẻ đường dẫn định tuyến, do đó, một ứng dụng có thể được định cấu hình để phục vụ các trình xử lý yêu cầu bổ sung. Các trình xử lý yêu cầu bổ sung, chẳng hạn như Controller MVC, hoạt động song song với các dịch vụ gRPC đã định cấu hình.
Tùy chọn máy chủ
Các dịch vụ gRPC có thể được lưu trữ bởi tất cả các máy chủ ASP.NET Core tích hợp.
- Kestrel
- TestServer
- IIS†
- HTTP.sys†
† Yêu cầu .NET 5 và Windows 11 Build 22000 hoặc Windows Server 2022 Build 20348 trở lên.
Để biết thêm thông tin về cách chọn máy chủ phù hợp cho ứng dụng ASP.NET Core, hãy xem Triển khai máy chủ web trong ASP.NET Core.
Kestrel
Kestrel là một máy chủ web đa nền tảng dành cho ASP.NET Core. Kestrel tập trung vào hiệu suất cao và sử dụng bộ nhớ, nhưng nó không có một số tính năng nâng cao trong HTTP.sys như chia sẻ cổng.
Endpoint gRPC của Kestrel:
- Yêu cầu HTTP/2.
- Nên được bảo mật bằng Transport Layer Security (TLS).
HTTP/2
gRPC yêu cầu HTTP/2. gRPC cho ASP.NET Core xác thực HttpRequest.Protocol là HTTP/2
.
Kestrel hỗ trợ HTTP/2 trên hầu hết các hệ điều hành hiện đại. Endpoint Kestrel được định cấu hình để hỗ trợ kết nối HTTP/1.1 và HTTP/2 theo mặc định.
TLS
Endpoint Kestrel dùng cho gRPC phải được bảo mật bằng TLS. Trong quá trình phát triển, endpoint được bảo mật bằng TLS sẽ tự động được tạo tại https://localhost:5001
khi có chứng chỉ phát triển ASP.NET Core. Không cần cấu hình. Tiền tố https
xác minh điểm cuối Kestrel đang sử dụng TLS.
Trong môi trường production, TLS phải được cấu hình rõ ràng. Trong ví dụ appsettings.json
sau, endpoint HTTP/2 được bảo mật bằng TLS được cung cấp:
{
"Kestrel": {
"Endpoints": {
"HttpsInlineCertFile": {
"Url": "https://localhost:5001",
"Protocols": "Http2",
"Certificate": {
"Path": "<path to .pfx file>",
"Password": "<certificate password>"
}
}
}
}
}
Ngoài ra, điểm cuối Kestrel có thể được định cấu hình trong Program.cs
:
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel(options =>
{
options.Listen(IPAddress.Any, 5001, listenOptions =>
{
listenOptions.Protocols = HttpProtocols.Http2;
listenOptions.UseHttps("<path to .pfx file>",
"<certificate password>");
});
});
Để biết thêm thông tin về cách bật TLS với Kestrel, hãy xem Cấu hình điểm cuối HTTPS của Kestrel.
Đàm phán giao thức
TLS được sử dụng cho nhiều mục đích hơn là bảo mật thông tin liên lạc. Quá trình bắt tay Đàm phán Giao thức Lớp Ứng dụng (ALPN) TLS được sử dụng để đàm phán giao thức kết nối giữa máy khách và máy chủ khi endpoint hỗ trợ nhiều giao thức. Quá trình đàm phán này xác định xem kết nối sử dụng HTTP/1.1 hay HTTP/2.
Nếu endpoint (điểm cuối) HTTP/2 được định cấu hình không có TLS thì ListenOptions.Protocols của điểm cuối phải được đặt thành HttpProtocols.Http2
. Một điểm cuối có nhiều giao thức, chẳng hạn như HttpProtocols.Http1AndHttp2
không thể sử dụng được nếu không có TLS vì không có sự đàm phán. Tất cả các kết nối đến điểm cuối không bảo mật đều được đặt mặc định là HTTP/1.1 và lệnh gọi gRPC đều không thành công.
Để biết thêm thông tin về cách bật HTTP/2 và TLS với Kestrel, hãy xem Cấu hình điểm cuối Kestrel.
Ghi chú
macOS không hỗ trợ ASP.NET Core gRPC với TLS trước bản .NET 8. Cần có cấu hình bổ sung để chạy thành công các dịch vụ gRPC trên macOS khi sử dụng .NET 7 trở về trước. Để biết thêm thông tin, hãy xem Không thể khởi động ứng dụng ASP.NET Core gRPC trên macOS.
IIS
Dịch vụ thông tin Internet (IIS) là một Máy chủ Web linh hoạt, an toàn và dễ quản lý để lưu trữ các ứng dụng web, bao gồm ASP.NET Core. Cần có .NET 5 và Windows 11 Build 22000 hoặc Windows Server 2022 Build 20348 trở lên để lưu trữ các dịch vụ gRPC với IIS.
IIS phải được cấu hình để sử dụng TLS và HTTP/2. Để biết thêm thông tin, hãy xem Sử dụng ASP.NET Core với HTTP/2 trên IIS.
HTTP.sys
HTTP.sys là máy chủ web dành cho ASP.NET Core chỉ chạy trên Windows. Cần có .NET 5 và Windows 11 Build 22000 hoặc Windows Server 2022 Build 20348 trở lên để lưu trữ các dịch vụ gRPC với HTTP.sys.
HTTP.sys phải được cấu hình để sử dụng TLS và HTTP/2. Để biết thêm thông tin, hãy xem hỗ trợ HTTP/2 của máy chủ web HTTP.sys.
Lưu trữ gRPC trong các dự án không phải ASP.NET Core
Máy chủ gRPC ASP.NET Core thường được tạo từ mẫu gRPC. Tệp dự án được tạo bởi mẫu sử dụng Microsoft.NET.SDK.Web
làm SDK:
<Project Sdk="Microsoft.NET.Sdk.Web">
<ItemGroup>
<PackageReference Include="Grpc.AspNetCore" Version="2.47.0" />
<Protobuf Include="Protos\greet.proto" GrpcServices="Server" />
</ItemGroup>
</Project>
Giá trị SDK Microsoft.NET.SDK.Web
tự động thêm tham chiếu đến framework ASP.NET Core. Tham chiếu này cho phép ứng dụng sử dụng các loại ASP.NET Core cần thiết để lưu trữ máy chủ.
Bạn có thể thêm máy chủ gRPC vào các dự án không phải ASP.NET Core bằng các cài đặt tệp dự án sau:
<Project Sdk="Microsoft.NET.Sdk">
<ItemGroup>
<PackageReference Include="Grpc.AspNetCore" Version="2.47.0" />
<Protobuf Include="Protos\greet.proto" GrpcServices="Server" />
<FrameworkReference Include="Microsoft.AspNetCore.App" />
</ItemGroup>
</Project>
File dự án trên:
- Không sử dụng
Microsoft.NET.SDK.Web
làm SDK. - Thêm tham chiếu framework vào
Microsoft.AspNetCore.App
.- Tham chiếu framework cho phép các ứng dụng không phải ASP.NET Core, chẳng hạn như Dịch vụ Windows, ứng dụng WPF hoặc ứng dụng WinForms sử dụng API ASP.NET Core.
- Ứng dụng hiện có thể sử dụng API ASP.NET Core để khởi động máy chủ ASP.NET Core.
- Thêm yêu cầu gRPC:
- Tham chiếu gói NuGet tới Grpc.AspNetCore.
- File
.proto
.
Để biết thêm thông tin về cách sử dụng Microsoft.AspNetCore.App
tham chiếu framework, hãy xem Sử dụng framework chia sẻ ASP.NET Core.
Tích hợp với API ASP.NET Core
Các dịch vụ gRPC có toàn quyền truy cập vào các tính năng của ASP.NET Core như Dependency Insert (DI) và Logging. Ví dụ: việc triển khai dịch vụ có thể giải quyết dịch vụ ghi nhật ký từ vùng chứa DI thông qua hàm tạo:
public class GreeterService : Greeter.GreeterBase
{
public GreeterService(ILogger<GreeterService> logger)
{
}
}
Theo mặc định, việc triển khai dịch vụ gRPC có thể giải quyết các dịch vụ DI khác trong bất kỳ thời gian nào (Singleton, Scoped hoặc Transient).
Giải quyết HttpContext trong các phương thức gRPC
API gRPC cung cấp quyền truy cập vào một số dữ liệu message HTTP/2, chẳng hạn như phương thức, máy chủ, tiêu đề (header) và đoạn giới thiệu (trailer). Quyền truy cập thông qua đối số ServerCallContext
được truyền cho từng phương thức gRPC:
public class GreeterService : Greeter.GreeterBase
{
public override Task<HelloReply> SayHello(
HelloRequest request, ServerCallContext context)
{
return Task.FromResult(new HelloReply
{
Message = "Hello " + request.Name
});
}
}
ServerCallContext
không cung cấp quyền truy cập đầy đủ HttpContext
vào tất cả các API ASP.NET. Phương thức mở rộng GetHttpContext
cung cấp quyền truy cập đầy đủ vào thể hiện (representing) HttpContext
message HTTP/2 cơ bản trong API ASP.NET:
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
});
}
}
Tài nguyên bổ sung
- Tạo máy khách và máy chủ .NET Core gRPC trong ASP.NET Core
- Tổng quan về gRPC trên .NET
- Dịch vụ gRPC với C#
- Máy chủ web Kestrel trong ASP.NET Core