2016-10-23 32 views
8

Próbuję napisać kawałek oprogramowania pośredniego, aby uniemożliwić przetwarzanie niektórych tras klienta na serwerze. Spojrzałem na wiele niestandardowych klas pośredniej, że zwarcie odpowiedź zASP.NET Core Response.End()?

context.Response.End(); 

nie widzę metody End() w intellisense. Jak mogę zakończyć odpowiedź i przerwać wykonywanie potoku http? Z góry dziękuję!

public class IgnoreClientRoutes 
{ 
    private readonly RequestDelegate _next; 
    private List<string> _baseRoutes; 

    //base routes correcpond to Index actions of MVC controllers 
    public IgnoreClientRoutes(RequestDelegate next, List<string> baseRoutes) 
    { 
     _next = next; 
     _baseRoutes = baseRoutes; 

    }//ctor 


    public async Task Invoke(HttpContext context) 
    { 
     await Task.Run(() => { 

      var path = context.Request.Path; 

      foreach (var route in _baseRoutes) 
      { 
       Regex pattern = new Regex($"({route})."); 
       if(pattern.IsMatch(path)) 
       { 
        //END RESPONSE HERE 

       } 

      } 


     }); 

     await _next(context); 

    }//Invoke() 


}//class IgnoreClientRoutes 
+0

Tylko nie nazwać 'next()'. – SLaks

Odpowiedz

8

Koniec już nie istnieje, ponieważ klasyczny rurociąg ASP.NET już nie istnieje. Środowiska są Rurociągiem. Jeśli chcesz przerwać przetwarzanie żądania w tym momencie, zwróć bez wywoływania następnego oprogramowania pośredniego. To skutecznie zatrzyma rurociąg.

Cóż, nie do końca, ponieważ stos zostanie rozwinięty, a niektóre middleware mogą nadal zapisywać pewne dane do odpowiedzi, ale otrzymasz pomysł. Z twojego kodu, wydajesz się, że chcesz uniknąć dalszego działania middleware w trakcie wykonywania.

EDYCJA: Oto jak to zrobić w kodzie.

public class Startup 
{ 
    public void Configure(IApplicationBuilder app) 
    { 
     app.Use(async (http, next) => 
     { 
      if (http.Request.IsHttps) 
      { 
       // The request will continue if it is secure. 
       await next(); 
      } 

      // In the case of HTTP request (not secure), end the pipeline here. 
     }); 

     // ...Define other middlewares here, like MVC. 
    } 
} 
+0

jak to zrobić w kodzie? – Geomorillo

+0

. Dziękuję za kod – Geomorillo

2

Metoda zakończenia już tam nie jest. W oprogramowaniu pośredniczącym, jeśli wywołasz następnego delegata w potoku, przejdzie on do następnego oprogramowania pośredniego, aby obsłużyć żądanie i kontynuować, w przeciwnym razie zakończyłoby to żądanie. Poniższy kod przedstawia przykładowe oprogramowanie pośrednie, które wywołuje następną metodę Invoke, jeśli to pominiesz, odpowiedź zostanie zakończona.

using System.Threading.Tasks; 
using Microsoft.AspNetCore.Http; 
using Microsoft.Extensions.Logging; 

namespace MiddlewareSample 
{ 
    public class RequestLoggerMiddleware 
    { 
     private readonly RequestDelegate _next; 
     private readonly ILogger _logger; 

     public RequestLoggerMiddleware(RequestDelegate next, ILoggerFactory loggerFactory) 
     { 
      _next = next; 
      _logger = loggerFactory.CreateLogger<RequestLoggerMiddleware>(); 
     } 

     public async Task Invoke(HttpContext context) 
     { 
      _logger.LogInformation("Handling request: " + context.Request.Path); 
      await _next.Invoke(context); 
      _logger.LogInformation("Finished handling request."); 
     } 
    } 
} 

Powracając do kodu powinieneś po prostu powrócić z metody w przypadku dopasowania wzorca.

Spójrz na ten doc z podstawowych Microsoft docs więcej szczegółów: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/middleware