.NET 云原生架构师训练营(KestrelServer源码分析)--学习笔记

本文详细分析了.NET云原生架构中的KestrelServer源码,从StartAsync方法开始,逐步揭示了网络请求如何通过AddressBinder、TransportManager到HttpConnectionMiddleware的处理流程。在KestrelServerImpl中,OnBind方法和TransportManager的BindAsync至关重要,它们负责接收和开始监听。HttpConnectionMiddleware的OnConnectionAsync方法处理请求,通过IRequestProcessor接口实现如Http2Connection的ProcessRequestsAsync方法,最终将网络二进制数据转化为HTTPContext并传递给应用程序层的管道,展示了KestrelServer如何作为ASP.NET Core的Web服务器实现。
摘要由CSDN通过智能技术生成

目录

  • 目标
  • 源码

目标

理解 KestrelServer 如何接收网络请求,网络请求如何转换成 http request context(C# 可识别)

源码

https://github.com/dotnet/aspnetcore/

在目录 aspnetcore\src\Servers\Kestrel\Core\src\Internal 下有一个 KestrelServerImpl

internal class KestrelServerImpl : IServer

在 host 启动的时候调用了 server 的 startup 方法,可以从这个入口开始

public async Task StartAsync<TContext>(IHttpApplication<TContext> application, CancellationToken cancellationToken) where TContext : notnull

StartAsync 方法主要分为以下三步

async Task OnBind(ListenOptions options, CancellationToken onBindCancellationToken)
{
    ...
}

AddressBindContext = new AddressBindContext(_serverAddresses, Options, Trace, OnBind);

await BindAsync(cancellationToken).ConfigureAwait(false);

BindAsync 方法中使用 AddressBindContext 进行绑定

await AddressBinder.BindAsync(Options.ListenOptions, AddressBindContext!, cancellationToken).ConfigureAwait(false);

在 AddressBinder 的 BindAsync 方法中创建了多种策略进行绑定

var strategy = CreateStrategy(
    listenOptions.ToArray(),
    context.Addresses.ToArray(),
    context.ServerAddressesFeature.PreferHostingUrls);

...

await strategy.BindAsync(context, cancellationToken).ConfigureAwait(false);

例如 AddressesStrategy,它有自己的一个绑定方法

private class AddressesStrategy : IStrategy
{
    protected readonly IReadOnlyCollection<string> _addresses;

    public AddressesStrategy(IReadOnlyCollection<string> addresses)
    {
        _addresses = addresses;
    }

    public virtual async Task BindAsync(AddressBindContext context, CancellationToken cancellationToken)
    {
        foreach (var address in _addresses)
        {
            var options = ParseAddress(address, out var https);
            context.ServerOptions.ApplyEndpointDefa
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值