У меня есть следующий код: промежуточногоМожет ли промежуточное ПО Owin возвращать ответ раньше, чем метод Invoke возвращается?
public class UoWMiddleware : OwinMiddleware
{
readonly IUoW uow;
public UoWMiddleware(OwinMiddleware next, IUoW uow) : base(next)
{
this.uow = uow;
}
public override async Task Invoke(IOwinContext context)
{
try
{
await Next.Invoke(context);
}
catch
{
uow.RollBack();
throw;
}
finally
{
if (uow.Status == Base.SharedDomain.UoWStatus.Running)
{
var response = context.Response;
if (response.StatusCode < 400)
{
Thread.Sleep(1000);
uow.Commit();
}
else
uow.RollBack();
}
}
}
}
Иногда мы наблюдаем, что возвращает ответ на клиент перед вызовом uow.Commit() через стельку. Например, мы поставили точку останова на uow.Commit, и мы видим, что ответ возвращается клиенту, несмотря на то, что мы находимся в ожидании точки останова. Это несколько неожиданно. Я думаю, что ответ будет строго возвращаться после завершения метода Invoke. Я что-то упускаю?
Позвольте мне кое-что прояснить. Я наблюдаю, что ответ «завершен», прежде чем мой метод owin вернется. Так вы говорите, что это по дизайну? –
Да, ответ отправляется в тот же самый момент, когда промежуточное программное обеспечение вызывает «Write», и это, я полагаю, происходит внутри вашего промежуточного программного обеспечения * next * (например, Web API). Вот почему вы видите ответ HTTP в скрипде, прежде чем ваш метод вернется. –
Да, видимо, вы правы. В моем случае я просто хотел подключиться к моменту отправки ответа. Поэтому обратный вызов OnSendingHeaders - это то, что я хочу. Ваше сообщение привело меня к правильному направлению. –