Мое промежуточное ПО OWIN пропускается?

У меня есть следующий код

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

Когда я получаю доступ к выходным данным (самостоятельное веб-приложение), я получаю одно из следующего:

  • 1234
  • 1243
  • 124

Порядок не имеет большого значения, но меня беспокоит, что "3" не отображается (124 отображается без 3)

Как это пропускается?


person Serge Profafilecebook    schedule 19.02.2016    source источник


Ответы (1)


Ваши 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 лямбда-выражений, которые, вероятно, значительно очистили бы этот код. Что-то типа:

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();
});
person Damien_The_Unbeliever    schedule 19.02.2016