基于.NET 7 的 WebTransport 实现双向通信

c348e8ecc665697d2ce70a2480df9227.gif

Web Transport 简介

WebTransport 是一个新的 Web API,使用 HTTP/3 协议来支持双向传输。它用于 Web 客户端和 HTTP/3 服务器之间的双向通信。它支持通过 不可靠的 Datagrams API 发送数据,也支持可靠的 Stream API 发送数据。

因为 HTTP/3 使用了基于 UDP 的 QUIC 协议,所以 Web Transport 可以在一个连接上创建多个流,而且不会相互阻塞。

WebTransport 支持三种不同类型的流量:数据报(datagrams) 以及单向流和双向流。

WebTransport 的设计基于现代 Web 平台基本类型(比如 Streams API)。它在很大程度上依赖于 promise,并且可以很好地与 async 和 await 配合使用。

在 .NET 7 中使用 WebTransport

WebTransport 在 .NET 7 以及以上版本可用,我们新建一个 .NET Core 的空项目,修改 csproj 文件,设置 EnablePreviewFeatures 和 RuntimeHostConfigurationOption ,如下

<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) =>
{
    // 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;
96ed927a0ad62efb6c396bc1c5fdb01d.png

在 JavaScript 中使用 WebTransport

传入服务地址并创建 WebTransport 实例, transport.ready 完成,此时连接就可以使用了。

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}`);
}

客户端和服务端双向通信

下面是一个具体的例子,使用 WebTransport 实现了客户端和服务端的双向通信。

838ce4a1fe5ad37fd7b2276ef01241cd.png ad630cec92e18e14b6be86e779b3e504.png 6d32ea051317c369fc97d62ca42a7d4e.png

完成的代码在下面的 github 地址。

https://github.com/danroth27/AspNetCoreNet7Samples/tree/main/WebTransportInteractiveSampleApp

希望对您有用!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ASP.NET 是一种用于构建网站和 Web 应用程序的开发框架,通常使用 HTTP 协议作为通信协议。虽然 ASP.NET 本身不直接支持 TCP 通信,但可以通过其它技术来实现 TCP 通信。 在 ASP.NET实现 TCP 通信有几种常见的方法。一种方法是使用 Sockets 类,在代码中创建一个 TCP 客户端或服务器端。这些类提供了用于创建 TCP 连接、发送和接收数据的方法。例如,可以使用 Sockets 类的 TcpClient 类和 TcpListener 类分别创建 TCP 客户端和服务器端。通过使用这些类,可以在 ASP.NET 代码中实现 TCP 通信。 另一种方法是使用 WCF(Windows Communication Foundation)框架,它是一种用于构建分布式应用程序的技术。WCF 提供了一种简单的方式来实现 TCP 通信。通过在 ASP.NET 代码中配置和使用 WCF,可以轻松地建立 TCP 通信连接,并发送和接收数据。 无论是使用 Sockets 类还是 WCF,需要注意 ASP.NET 的线程模型。ASP.NET 应用程序是基于请求/响应模型的,这意味着每个请求都在一个独立的线程上执行。由于 TCP 是一种持久连接的协议,使用 TCP 通信时需要处理多线程和并发访问的问题。可以使用锁或其他线程同步机制来确保线程安全性和数据一致性。 总而言之,虽然 ASP.NET 本身不直接支持 TCP 通信,但可以通过使用 Sockets 类或 WCF 框架来实现 TCP 通信。选择合适的方法取决于具体的需求和技术要求。无论使用哪种方法,都需要注意 ASP.NET 的线程模型,并考虑如何处理多线程和并发访问的问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值