2016-04-19 9 views
3

Meine Middleware-Klasse ist in verschiedenen Klassenbibliothek Projekt und Controller ist in verschiedenen Projekt. Was ich versuche zu tun, wenn bestimmte Bedingung nicht erfüllt dann Redirect auf die Custom Controller/Action-Methode von Middleware.Call-Controller-Aktionsmethode von Middleware

Allerdings kann ich das mit Response.Redirect-Methode nicht tun.

Wie kann ich dies in Middleware-Klasse tun?

Jede Hilfe auf diese geschätzt!

Rohit

+1

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? –

+0

@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

Antwort

5

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:

    1. lesen (und ändern), um die eingehende Anfrage.

    2. Entscheiden Sie, ob Sie die Anforderung vollständig behandeln oder die Verarbeitung an die nächste Komponente weiterleiten möchten.

    3. 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.

+0

Könnten Sie bitte ein kleines Beispiel für 404 und IActionFilter geben? Vielen Dank ! – Rohit

+0

Zum Schreiben auf die Antwort siehe z.B. [dieses Q/A] (http://stackoverflow.com/questions/32532058/how-do-iask-owin-katana-to-write-headers-to-the-output-stream). Für "IActionFilter" Beispiele, schauen Sie [hier] (https://damienbod.com/2014/01/04/web-api-2-using-actionfilterattribute-overrideactionfiltersattribute-and-ioc-injection/) –

+0

Könnten Sie bitte erklären warum Sein Anwendungsfall ist für Middleware ungeeignet. –

5

Hier ist Middleware, die die Anfrage untersucht und weiterleitet. Es funktioniert entweder mit Inline-Middleware oder mit einer Middleware-Klasse.

public void Configure(IApplicationBuilder app) 
{ 
    // use inline middleware 
    app.Use(async (context, next) => 
    { 
     // if specific condition does not meet 
     if (context.Request.Path.ToString().Equals("/foo")) 
     { 
      context.Response.Redirect("path/to/controller/action"); 
     } 
     else 
     { 
      await next.Invoke(); 
     } 
    }); 

    // or use a middleware class 
    app.UseMiddleware<RedirectMiddleware>(); 

    app.UseMvc(); 
} 

Hier ist die Middleware-Klasse.

public class RedirectMiddleware 
{ 
    private readonly RequestDelegate _next; 

    public RedirectMiddleware(RequestDelegate next) 
    { 
     _next = next; 
    } 

    public async Task Invoke(HttpContext context) 
    { 
     // if specific condition does not meet 
     if (context.Request.Path.ToString().Equals("/bar")) 
     { 
      context.Response.Redirect("path/to/controller/action"); 
     } 
     else 
     { 
      await _next.Invoke(context); 
     } 
    } 
} 

Weitere Informationen finden Sie unter Docs » Fundamentals » Middleware.

+1

Offenbar haben Sie die Configure-Methode der Startup-Klasse bereitgestellt? Wie kann ich es aus der Middleware zurückgeben, wenn dort ein Fehler auftritt? – Rohit

+0

Das 'app.Use' ist Middleware. :-) Ich habe eine andere Möglichkeit hinzugefügt. –

+1

@ShaunLatin Danke für die Hilfe! Es funktioniert ! – Rohit

Verwandte Themen