Es scheint, dass Sie eine Middleware für den falschen Gründen verwenden.
Ich empfehle Ihnen, die Middleware entweder eine (sehr minimal) zurückkehren 404, indem sie einfach in den Antwortstream zu schreiben (statt Weiterleitung an Next()
), oder tun dies nicht in einer Middleware tun, sondern in ein global registriert IActionFilter
in Ihrer MVC-App.
Ich habe die Gründe für die oben genannten Ratschläge in den Kommentaren erklärt, aber ich denke, es ist wichtig genug ist, in die tatsächliche Antwort zu heben:
In einer Middleware-Pipeline, möchten Sie jede Komponente zu sein, wie unabhängig wie möglich. Ein paar Dinge diese lose Kopplung in OWIN aktiviert:
Die Eingabe in und Ausgabe aus, wobei jede Komponente das gleiche Format hat, ob es 10 andere Middleware-Komponenten, bevor sie, oder gar keine
die Konvention ist, dass jeder Teil der Pipeline man tun kann, oder mehrere der drei Dinge, die in dieser Reihenfolge:
lesen (und ändern), um die eingehende Anfrage.
Entscheiden Sie, ob Sie die Anforderung vollständig behandeln oder die Verarbeitung an die nächste Komponente weiterleiten möchten.
Schreiben Sie in den Antwort-Stream.
Wenn auf diese Konventionen kleben, wird es sehr einfach zu komponieren, zu zerlegen und wieder zusammensetzen Pipelines aus wieder verwendbaren Middleware-Komponenten. (Möchten Sie die Protokollierung der Anfrage? Verbinden Sie einfach eine Middleware-Komponente am Anfang der Pipe. Möchten Sie eine allgemeine Authentifizierungslogik auf der ganzen Linie? Fügen Sie eine Komponente in der Auth-Phase der Pipe hinzu. Möchten Sie zu einem anderen Logging-Framework wechseln? Wollen Sie die gleiche Protokollierung über ein Ökosystem von Microservices anwenden? Verwenden Sie die Komponente. Etcetera, ad infinum ...) Das funktioniert so gut, weil die Komponenten sowohl innerhalb ihrer Grenzen bleiben, als auch mit einem Vertrag arbeiten, den das Web Server selbst kann das verstehen.
ASP.NET WebAPI scheint ein anderes Biest zu sein, aber in Wirklichkeit ist es nur eine andere OWIN-Komponente, die immer konfiguriert ist, um die Anfrage zu behandeln, und niemals an eine nächste Komponente weiterzuleiten (und sie dadurch erschwert hat) um eine Komponente zu registrieren, nachdem WebApi in der Pipeline ist ...).
Was Sie versuchen zu tun, bricht den Vertrag des zweiten Punktes dort - Sie möchten der nächsten Komponente sagen, wie die Anfrage zu behandeln ist. Aber das liegt nicht an dir - es liegt an der nächsten Komponente.
Wie ist der Zustand? Ist es Authentifizierung/Autorisierung oder etwas anderes? Wenn es auth ist, möchten Sie wahrscheinlich '401' oder' 403' zurückgeben (abhängig davon, ob Authentifizierung oder Autorisierung fehlschlägt), und wenn es etwas anderes ist, möchten Sie es wahrscheinlich gar nicht erst in einer Middleware machen. Könnten Sie genauer sein? –
@TomasLycken Ja, es ist nicht im Zusammenhang mit Authentifizierung/Autorisierung, es ist für, wenn bestimmte Client/Tenant nicht gefunden wird, dann umleiten an einige Controller-Aktion Methode, um Fehlermeldung anzuzeigen. Um den Client-Namen von httpcontext zu erhalten, wird die Logik in Middleware geschrieben. – Rohit