2008-11-10 38 views
5

Tôi đang cố gắng tìm ra cách xóa/hủy yêu cầu, về cơ bản tôi đang cố gắng triển khai danh sách IP bị chặn trong ứng dụng để chặn người gửi spam và tôi không muốn trả lại bất kỳ phản hồi nào (chỉ cần bỏ qua yêu cầu), là điều này có thể trong ASP.NET?Làm thế nào để thả/loại bỏ một yêu cầu trong ASP.NET?

Chỉnh sửa: Một số câu trả lời gợi ý rằng tôi có thể thêm chúng vào tường lửa, trong khi điều này chắc chắn sẽ tốt hơn, nó không phù hợp trong trường hợp của tôi. Để tạo một câu chuyện dài, tôi thêm phần kiểm duyệt vào trang web của tôi, nơi người kiểm duyệt sẽ kiểm tra các bài đăng đang chờ kiểm duyệt spam (được lọc bởi bộ lọc spam), tôi muốn IP của người gửi một số bài đăng được thêm vào danh sách các IP bị chặn sau khi một bài đăng được đánh dấu là spam bởi người kiểm duyệt, đây là lý do tại sao tôi muốn làm điều đó trong ứng dụng.

Chỉnh sửa: Gọi phản hồi.End() trả về phản hồi cho người dùng (mặc dù nó trống), toàn bộ mục đích của câu hỏi của tôi là cách không trả lại bất kỳ phản hồi nào. Điều này có thể (thậm chí không tò mò)? Ngoài ra còn có Response.Close() mà đóng socket nhưng nó sẽ gửi thông báo (trong TCP/IP) khi nó làm điều này, tôi chỉ wan bỏ qua vì nó nếu không bao giờ nhận được (tức là không gửi gì cho người dùng)

Thanks

Trả lời

3

có lẽ bạn có thể sử dụng

Response.Clear(); 
Response.End(); 
+1

Cám ơn câu trả lời của bạn, nhưng thực sự điều này sẽ trả về một phản ứng, tôi đang cố gắng để chỉ cần bỏ qua các yêu cầu. –

2

Suy nghĩ đầu tiên của tôi đã những gì John đề nghị. Giải pháp lý tưởng nhất là thêm các IP đó vào danh sách các IP bị chặn trong tường lửa của bạn nếu bạn có quyền truy cập vào nó, theo cách đó, ứng dụng của bạn không phải thực hiện bất kỳ xử lý nào.

+0

và đây là điều đầu tiên tôi nghĩ, nhưng câu hỏi cho biết "trong ứng dụng của tôi" :) –

2

EDIT: Điều này có thể được triển khai tốt hơn dưới dạng HTTPModule thay vì trình xử lý, nhưng ý tưởng cơ bản là đúng. Xem http://www.kowitz.net/archive/2006/03/08/ihttpmodule-vs-ihttphandler.aspx để biết thêm chi tiết


Bạn có thể làm điều này bằng một HttpHandler, như vậy bạn sẽ không phải lo lắng về việc kiểm tra này trong mã ứng dụng của bạn - nó xử lý trước khi ứng dụng của bạn thậm chí thực hiện.

psudo mã - chưa được thử nghiệm

class IgnoreHandler : IHttpHandler 
{ 
    #region IHttpHandler Members 

    public bool IsReusable 
    { 
     get { return true; } 
    } 

    public void ProcessRequest(HttpContext context) 
    { 
     context.Response.Clear(); 
     context.Response.StatusCode = 401; 
     context.Response.Status = "Unauthorized"; 
     context.Response.End(); 
    } 

    #endregion 
} 

Rõ ràng, nếu bạn muốn nó trở lại HTTP 200 (OK) và một trang trống, chỉ cần loại bỏ hai dòng đề cập đến StatusCode và Trạng thái.

Và sau đó đăng ký nó trong web.config

<httpHandlers> 
    <add verb="*" 
     path="*" 
     validate="false" 
     type="MyNamespace.IgnoreHandler, MyAssembly" /> 
</httpHandlers> 
4

Đối với loại điều, tôi sẽ đi với một HTTP Module như trái ngược với làm điều này với một handler hoặc một trang.

Tại sao sử dụng mô-đun thay vì trình xử lý? Mô-đun HTTP được gọi trước đó trong đường dẫn yêu cầu. Đối với các loại yêu cầu được liệt kê trong danh sách cấm này, bạn muốn xóa yêu cầu sớm nhất và nhanh nhất có thể. Điều này có nghĩa là trước đó trong yêu cầu bạn có thể thả yêu cầu, thì càng tốt.

Bạn có thể đọc thêm một chút về Mô-đun và Trình xử lý here.

+0

Heh. Xem bài chỉnh sửa cho bài đăng của tôi. Tôi đọc câu trả lời của bạn sau khi tôi thêm bình luận của mình. –

0

Tôi sẽ đề xuất giải pháp tốt nhất là không đưa ra "không phản hồi" cụ thể nào nhưng để cung cấp thông báo lỗi http tiêu chuẩn không khuyến khích hơn.Bất cứ khi nào tôi đang cố gắng để ngăn cản người dùng trái phép tôi đưa ra một trang/url không tìm thấy thông điệp như sau:

throw new HttpException(404, "File not found - " + Request.AppRelativeCurrentExecutionFilePath);

Tôi nghĩ rằng điều này là rất hiệu quả trong việc thuyết phục người ở đầu kia để từ bỏ và biến mất.

0

Bạn có thể muốn xem điều này http://www.angrypets.com/tools/rdos/, điều tương tự với những gì bạn đang nói, vì những lý do tương tự và được triển khai làm mô-đun.

0

Một cách gây khó chịu khác nhưng dễ thực hiện là Ngủ yêu cầu trong một khoảng thời gian không khuyến khích trước khi đóng.

+0

Ngủ yêu cầu sẽ giữ yêu cầu đó tồn tại lâu hơn trên máy chủ, sử dụng nhiều CPU và tài nguyên hơn, đúng không? Tôi nghĩ tôi sẽ giết nó khi ngủ. – Austin

0

AFAIK không có cách nào để hoàn toàn bỏ yêu cầu mà không có phản hồi. Bạn có thể giữ cho các yêu cầu quay trong ASP.NET với bất kỳ chủ đề ngủ kỹ thuật mà bạn thích nhưng bạn không làm cho cuộc sống tốt hơn cho máy chủ của bạn theo cách đó.

Cách tốt nhất mà tôi biết để đạt được những gì bạn muốn là có người quản lý lưu lượng truy cập như ZXTM đóng yêu cầu trước khi nó đến máy chủ web.

0

Ở đây bạn đi:

public class RequestDropper : IHttpModule 
{ 
    public void Dispose() 
    { 
     throw new NotImplementedException(); 
    } 

    public void Init(HttpApplication context) 
    { 
     context.BeginRequest += Context_BeginRequest; 
    } 

    public void Context_BeginRequest(object sender, EventArgs e) 
    { 
     var request = ((HttpApplication)sender).Context.Request; 

     if (todayIAmNotInAMoodToProcessRequests) 
     { 
      request.Abort(); 
     } 
    } 
} 

Hy vọng điều này giúp bạn tiết kiệm một số thời gian

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