<Project Sdk="Microsoft.NET.Sdk.Web"> <PropertyGroup> <EnablePreviewFeatures>True</EnablePreviewFeatures> </PropertyGroup> <ItemGroup> <RuntimeHostConfigurationOption Include="Microsoft.AspNetCore.Server.Kestrel.Experimental.WebTransportAndH3Datagrams" Value="true" /> </ItemGroup> </Project>要设置 WebTransport 连接,首先需要配置 Web 主机并通过 HTTP/3 侦听端口:
var builder = WebApplication.CreateBuilder(args); builder.WebHost.ConfigureKestrel((context, options) => { // 堆代码 www.duidaima.com // Port configured for WebTransport options.ListenAnyIP([SOME PORT], listenOptions => { listenOptions.UseHttps(GenerateManualCertificate()); listenOptions.Protocols = HttpProtocols.Http1AndHttp2AndHttp3; }); }); var app = builder.Build();修改下面的代码,接收 WebTransport 请求和会话。
app.Run(async (context) => { var feature = context.Features.GetRequiredFeature<IHttpWebTransportFeature>(); if (!feature.IsWebTransportRequest) { return; } var session = await feature.AcceptAsync(CancellationToken.None); }); await app.RunAsync();等待 AcceptStreamAsync 方法直到接收到一个 Stream,使用 stream.Transport.Input 写入数据,stream.Transport.Output 读取数据。
var stream = await session.AcceptStreamAsync(CancellationToken.None); var inputPipe = stream.Transport.Input; var outputPipe = stream.Transport.Output;
const url = 'https://localhost:5002'; const transport = new WebTransport(url); await transport.ready;连接到服务器后,可以使用 Streams API 发送和接收数据。
// Send two Uint8Arrays to the server. const stream = await transport.createSendStream(); const writer = stream.writable.getWriter(); const data1 = new Uint8Array([65, 66, 67]); const data2 = new Uint8Array([68, 69, 70]); writer.write(data1); writer.write(data2); try { await writer.close(); console.log('All data has been sent.'); } catch (error) { console.error(`An error occurred: ${error}`); }客户端和服务端双向通信
完成的代码在下面的 github 地址。
https://github.com/danroth27/AspNetCoreNet7Samples/tree/main/WebTransportInteractiveSampleApp