خوب دوستان بالاخره http/3 در دات نت ۶ به سی شارپ اومد
ما در این آموزش قصد داریم مثال کوچکی درباره http/3 در سی شارپ و دات نت ۶ بزنیم
البته توجه کنید ما این کار را به دو صورت انجام می دهیم
1)Kestrel Server و HTTP/3 Client
2)gRPC با HTTP/3 به صورت ASP.NET Server و Client
Kestrel Server
کد زیر را به property اضافه کنید:
<PropertyGroup>
<EnablePreviewFeatures>True</EnablePreviewFeatures>
</PropertyGroup>
و کد ساخت یک listener ساده:
public static async Task Main(string[] args)
{
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel((context, options) =>
{
options.Listen(IPAddress.Any, 5001, listenOptions =>
{
// Use HTTP/3
listenOptions.Protocols = HttpProtocols.Http1AndHttp2AndHttp3;
listenOptions.UseHttps();
});
});
}
آموزش های بیشتر: Use HTTP/3 with the ASP.NET Core Kestrel web server
HTTP/3 Client
HttpClient به http/3 به روز شده اما باید این قابلیت به صورت زیر فعال شود
<ItemGroup>
<RuntimeHostConfigurationOption Include="System.Net.SocketsHttpHandler.Http3Support" Value="true" />
</ItemGroup>
HTTP/3 needs to be specified as the version for the request:
// See https://aka.ms/new-console-template for more information
using System.Net;
var client = new HttpClient();
client.DefaultRequestVersion = HttpVersion.Version30;
client.DefaultVersionPolicy = HttpVersionPolicy.RequestVersionExact;
var resp = await client.GetAsync("https://localhost:5001/");
var body = await resp.Content.ReadAsStringAsync();
Console.WriteLine($"status: {resp.StatusCode}, version: {resp.Version}, body: {body.Substring(0, Math.Min(100, body.Length))}");
HttpClient به http/3 به روز شده اما باید این قابلیت به صورت زیر فعال شود
gRPC با HTTP/3
grpc معمولا http/2 کار می کند و استفاده از آن در http/3 معمول نیست ولی می توان استفاده کرد
کد زیر بر اساس نمونه greeter sample و با پروتوی hello world proto.
ASP.NET Server
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddGrpc();
builder.WebHost.ConfigureKestrel((context, options) =>
{
options.Listen(IPAddress.Any, 5001, listenOptions =>
{
listenOptions.Protocols = HttpProtocols.Http3;
listenOptions.UseHttps();
});
});
var app = builder.Build();
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
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();
Client
using Grpc.Net.Client;
using GrpcService1;
using System.Net;
var httpClient = new HttpClient();
httpClient.DefaultRequestVersion = HttpVersion.Version30;
httpClient.DefaultVersionPolicy = HttpVersionPolicy.RequestVersionExact;
var channel = GrpcChannel.ForAddress("https://localhost:5001", new GrpcChannelOptions() { HttpClient = httpClient });
var client = new Greeter.GreeterClient(channel);
var response = await client.SayHelloAsync(
new HelloRequest { Name = "World" });
Console.WriteLine(response.Message);
تمام.