Ich habe folgende Middleware-Code:Kann eine Owin Middleware eine Antwort zurückgeben, bevor die Methode Invoke zurückgibt?
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();
}
}
}
}
Gelegentlich beobachten wir, dass die Antwort kehrt zum Client vor uow.Commit() über Fiedler aufrufen. Zum Beispiel setzen wir einen Unterbrechungspunkt auf uow.Commit und wir sehen, dass die Antwort an den Client zurückgegeben wird, obwohl wir auf dem Haltepunkt warten. Das ist etwas unerwartet. Ich würde denken, dass die Antwort nach dem Ende der Invoke-Methode genau zurückkehrt. Fehle ich etwas?
Lassen Sie mich etwas klarstellen. Ich beobachte, dass die Antwort "abgeschlossen" ist, bevor meine owin-Methode zurückkehrt. Also sagen Sie, dass dies beabsichtigt ist? –
Ja, die Antwort wird im selben Moment gesendet, in dem eine Middleware 'Write' aufruft, und das, nehme ich an, passiert innerhalb Ihrer * nächsten * Middleware (z.B. Web-API). Aus diesem Grund sehen Sie die HTTP-Antwort in Fiddler, bevor Ihre Methode zurückkehrt. –
Ja anscheinend hast du recht. In meinem Fall wollte ich nur auf die Momentantwort zugreifen. Also OnSendingHeaders Callback ist was ich will. Dein Beitrag führte mich in die richtige Richtung. –