我的 OWIN 中间件被跳过了吗?

My OWIN middleware gets skipped?

我有以下代码

public class Startup
{
    public void Configuration(IAppBuilder appBuilder)
    {
        appBuilder.Use((owinContext, next) =>
        {
            return owinContext.Response.WriteAsync("1").ContinueWith(task => next()).ContinueWith(task => owinContext.Response.WriteAsync("4"));
        });
        appBuilder.Use((owinContext, next) => owinContext.Response.WriteAsync("2").ContinueWith(task => next()) );
        appBuilder.Use((owinContext, next) => owinContext.Response.WriteAsync("3").ContinueWith(task => next()));
    }
}

当我访问输出(自托管网络应用程序)时,我得到以下信息之一:

排序并不重要,但令我困扰的是当“3”没有显示时(124 显示时没有 3)

怎么会被跳过?

您的 ContinueWith(task=>next()) 调用将任务封装在任务中。您可能需要使用 Unwrap 扩展方法。

基本上,这些延续是 运行 在您的第一个 WriteAsync 方法完成之后。然后他们正在执行 next() 但这是返回一个新的 Task 而不是等待它完成。

类似于:

appBuilder.Use((owinContext, next) =>
{
    return owinContext.Response.WriteAsync("1").ContinueWith(task => next()).Unwrap()
                   .ContinueWith(task => owinContext.Response.WriteAsync("4")).Unwrap();
});
appBuilder.Use((owinContext, next) => owinContext.Response.WriteAsync("2")
                   .ContinueWith(task => next()).Unwrap() );
appBuilder.Use((owinContext, next) => owinContext.Response.WriteAsync("3")
                   .ContinueWith(task => next()).Unwrap() );

(我什至在第一个中错过了一个更需要的 Unwrap,另一个 ContinueWith 正在创建一个 Task<Task>

或者,我会考虑使用 async lambda,这可能会更清楚地清理这段代码。类似于:

appBuilder.Use(async (owinContext, next) =>
{
    await owinContext.Response.WriteAsync("1");
    await next();
    await owinContext.Response.WriteAsync("4");
});
appBuilder.Use(async (owinContext, next) => {
    await owinContext.Response.WriteAsync("2");
    await next();
});
appBuilder.Use(async (owinContext, next) => {
    await owinContext.Response.WriteAsync("3");
    await next();
});