如何在ASP.NET中删除/放弃请求?
我试图找出如何删除/放弃请求,我基本上是试图在我的应用程序中实现IP阻止列表来阻止垃圾邮件发送者,我不想返回任何响应(只需忽略请求),这在ASP.NET中可能吗 编辑:一些答案建议我可以将它们添加到防火墙中,但这肯定会更好,因为它不适合我的情况。长话短说,我在我的网站上添加了一个审核区,审核人将检查等待审核的帖子是否有垃圾邮件(由垃圾邮件过滤程序过滤),我希望在某个帖子被审核人标记为垃圾邮件后,将某个帖子的发件人的IP添加到阻止的IP列表中,这就是我希望在应用程序中这样做的原因 Edit:调用Response.End()将响应返回给用户(即使是空的),我的问题的全部目的是如何不返回任何响应。这可能吗(甚至出于好奇)?还有Response.Close()关闭套接字,但当它这样做时会发送通知(在TCP/IP中),我只是想忽略它,因为它从未收到过(即不向用户发送任何内容) 谢谢也许你可以如何在ASP.NET中删除/放弃请求?,asp.net,Asp.net,我试图找出如何删除/放弃请求,我基本上是试图在我的应用程序中实现IP阻止列表来阻止垃圾邮件发送者,我不想返回任何响应(只需忽略请求),这在ASP.NET中可能吗 编辑:一些答案建议我可以将它们添加到防火墙中,但这肯定会更好,因为它不适合我的情况。长话短说,我在我的网站上添加了一个审核区,审核人将检查等待审核的帖子是否有垃圾邮件(由垃圾邮件过滤程序过滤),我希望在某个帖子被审核人标记为垃圾邮件后,将某个帖子的发件人的IP添加到阻止的IP列表中,这就是我希望在应用程序中这样做的原因 Edit:调用R
Response.Clear();
Response.End();
我的第一个想法是约翰的建议。最理想的解决方案是,如果您有权访问防火墙,将这些IP添加到被阻止的IP列表中,这样您的应用程序就不必进行任何处理。编辑:这可能更好地实现为HTTPModule而不是处理程序,但基本思想是正确的。有关更多详细信息,请参阅
您可能可以使用httphandler来实现这一点,这样您就不必担心在应用程序代码中检查它——甚至在执行应用程序之前就已经处理了它 Psudo代码-未测试
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
}
显然,如果您希望它返回HTTP200(OK)和一个空白页面,只需删除引用StatusCode和Status的两行即可
然后在web.config中注册它
<httpHandlers>
<add verb="*"
path="*"
validate="false"
type="MyNamespace.IgnoreHandler, MyAssembly" />
</httpHandlers>
对于这类事情,我会使用而不是使用处理程序或页面 为什么使用模块而不是处理程序?在请求管道的前面调用HTTP模块。对于这些类型的黑名单请求,您希望尽早、快速地删除请求。这意味着您可以在请求中越早删除请求,效果越好
您可以阅读更多关于模块与处理程序的内容。我建议最好的解决方案不是给出特定的“无响应”,而是给出更令人沮丧的标准http错误消息。每当我试图劝阻未经授权的用户时,我会发出一条页面/url未找到消息,如下所示:
throw new HttpException(404, "File not found - " + Request.AppRelativeCurrentExecutionFilePath);
我认为这在说服另一端的人放弃并离开方面非常有效。你可能想看看这一点,出于类似的原因,这一点与你所说的类似,并且作为一个模块来实现。另一个烦人但简单的方法是在关闭请求之前将请求休眠一段令人沮丧的时间。如果没有响应,则无法直接删除请求。您可以使用您喜欢的任何线程休眠技术在ASP.NET中保持请求的旋转,但这样并不能改善服务器的性能 据我所知,实现您所需的最好方法是使用流量管理器,如在请求到达Web服务器之前关闭请求。给您:
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();
}
}
}
希望这能为您节省一些时间,这是我想到的第一件事,但问题是“在我的应用程序中”:)嘿。请参见编辑我的帖子。在添加我的评论后,我阅读了您的回答。谢谢您的回答,但实际上这将返回一个响应,我正在尝试忽略该请求。休眠该请求将使该请求在服务器上保持更长的活动时间,消耗更多的CPU和资源,对吗?我想我会杀了它。