Builder Configure(Action<IApplicationBuilder> configure);
IWebHost Build();
}
public class WebHostBuilder : IWebHostBuilder
{
private readonly List<Action<IApplicationBuilder>> _configures = new List<Action<IApplicationBuilder>>();
private IServer _server;
public IWebHost Build()
{
//所有的中间件都注册在builder上
var builder = new ApplicationBuilder();
foreach (var config in _configures)
{
config(builder);
}
return new WebHost(_server, builder.Build());
}
public IWebHostBuilder Configure(Action<IApplicationBuilder> configure)
{
_configures.Add(configure);
return this;
}
public IWebHostBuilder UseServer(IServer server)
{
_server = server;
return this;
}
}
给IWebHostBuilder加一个扩展方法,用来使用HttpListenerServer 服务器
public static partial class Extensions
{
public static IWebHostBuilder UseHttpListener(this IWebHostBuilder builder, params string[] urls)
{
return builder.UseServer(new HttpListenerServer(urls));
}
}
修改Mian方法
static async Task Main(string[] args)
{
await new WebHostBuilder()
.UseHttpListener()
.Configure(app=>
app.Use(FooMiddleware)
.Use(BarMiddleware)
.Use(BazMiddleware))
.Build()
.StartAsync();
}
完成。
七 添加一个UseMiddleware 扩展 玩玩
public static IApplicationBuilder UseMiddleware(this IApplicationBuilder application, Type type)
{
//省略实现
}
public static IApplicationBuilder UseMiddleware<T>(this IApplicationBuilder application) where T : class
{
return application.UseMiddleware(typeof(T));
}
添加一个中间件
public class QuxMiddleware
{
private readonly RequestDelegate _next;
public QuxMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task InvokeAsync(HttpContext context)
{
await context.Response.WriteAsync("qux=>");
await _next(context);
}
}
public static partial class Extensions
{
public static IApplicationBuilder UseQux(this IApplicationBuilder builder)
{
return builder.UseMiddleware<QuxMiddleware>();
}
}
使用中间件
class Program
{
static async Task Main(string[] args)
{
await new WebHostBuilder()
.UseHttpListener()
.Configure(app=>
app.Use(FooMiddleware)
.Use(BarMiddleware)
.Use(BazMiddleware)
.UseQux())
.Build()
.StartAsync();
}
运行结果
最后,期待Artech 新书。