2016-10-23 24 views
8

Tôi đang cố gắng viết một phần của phần mềm trung gian để giữ cho các tuyến đường khách hàng nhất định không được xử lý trên máy chủ. Tôi đã xem xét rất nhiều lớp middleware tùy chỉnh sẽ phản ứng ngắn vớiASP.NET Core Response.End()?

context.Response.End(); 

Tôi không thấy phương thức End() trong intellisense. Làm cách nào để chấm dứt phản hồi và ngừng thực hiện đường dẫn http? Cảm ơn trước!

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

Chỉ cần không gọi 'next()'. – SLaks

Trả lời

8

Kết thúc không còn tồn tại nữa, vì đường dẫn ASP.NET cổ điển không còn tồn tại nữa. Phần giữa là đường ống. Nếu bạn muốn ngừng xử lý yêu cầu tại thời điểm đó, hãy quay lại mà không cần gọi phần mềm trung gian tiếp theo. Điều này sẽ có hiệu quả ngăn chặn các đường ống.

Vâng, không hoàn toàn, bởi vì ngăn xếp sẽ được unwound và một số middlewares vẫn có thể viết một số dữ liệu để phản ứng, nhưng bạn có được ý tưởng. Từ mã của bạn, bạn dường như muốn tránh các phần mềm trung gian khác trong quá trình thực thi.

EDIT: Đây là cách thực hiện trong mã.

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

làm thế nào để làm điều đó trong mã xin vui lòng? – Geomorillo

+0

tôi thấy cảm ơn mã – Geomorillo

2

Phương thức kết thúc không còn ở đó nữa. Trong phần mềm trung gian của bạn, nếu bạn gọi đại biểu tiếp theo trong đường ống, nó sẽ chuyển đến phần mềm trung gian tiếp theo để xử lý yêu cầu và tiếp tục, nếu không nó sẽ kết thúc yêu cầu. Đoạn mã sau đây cho thấy một phần mềm trung gian mẫu gọi phương thức next.Invoke, nếu bạn bỏ qua nó, câu trả lời sẽ kết thúc.

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."); 
     } 
    } 
} 

Quay lại mã của bạn, bạn chỉ cần trở về từ phương pháp trong trường hợp khớp mẫu.

Hãy xem tài liệu này từ tài liệu chính của Microsoft để biết thêm chi tiết: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/middleware

Các vấn đề liên quan