Ich habe eine OWIN-Middleware-Klasse, um eine Authentifizierung basierend auf einigen benutzerdefinierten Tokens durchzuführen. Alles funktioniert gut. Ich möchte jedoch eine nützliche Fehlerantwort an den Client zurückgeben. Mein Argument ist, dass, wenn der Client nach einer "application/json" -Antwort fragt und sie ein serialisiertes Objekt erwartet, dann sollten sie das bekommen, selbst wenn es ein 401-Statuscode ist.Ausnahmen von OWIN-Middleware zurückgeben
Hier ist der Invoke Abschnitt meiner Middleware:
public override async Task Invoke(IOwinContext context)
{
try
{
this.DoAuthorization(context);
await this.Next.Invoke(context);
}
catch (UnauthorizedAccessException ex)
{
this.GenerateErrorResult(context, HttpStatusCode.Unauthorized, this.ExceptionToString(ex));
}
catch (Exception ex)
{
this.GenerateErrorResult(context, HttpStatusCode.InternalServerError, this.ExceptionToString(ex));
}
}
private void GenerateErrorResult(IOwinContext context, HttpStatusCode code, string errorMessage)
{
var result = new Result { Status = Result.EStatus.Error, ErrorText = errorMessage };
context.Response.StatusCode = (int)code;
context.Response.ContentType = "application/json";
context.Response.Write(JsonConvert.SerializeObject(result));
}
Das alles funktioniert gut, aber:
- ist dies die 'richtige' Art und Weise?
- was ist, wenn der Kunde für ‚application/xml‘ fragt, was offensichtlich Web-API ganz unterstützt
eine bessere Möglichkeit, ein benutzerdefiniertes Antwortobjekt zurückzukehren (‚Ergebnis‘ in meinem Fall) Gibt es fähig ist, dass wird serialisiert, wie der Client es erwarten würde?
Diese Antwort könnte Ihnen helfen: http://stackoverflow.com/questions/30918649/unhandled-exception-global-handler-for -owin-katana –
Sieht wie ein nützlicher Trick aus, aber ich sehe immer noch nicht, wie man mit IOwinContext ein Antwortobjekt automatisch serialisieren kann (ohne manuelle Serialisierung mit JsonConvert usw.). Die Controller müssen nur ein Objekt zurückgeben, das das Framework nach json oder xml serialisiert. Warum kann die Middleware das nicht tun? – Paul
Ich glaube, dass Sie es selbst serialisieren müssen, da owin Middleware aus Webapi-Bereich ist. –