我正在尝试弄清楚如何删除/放弃请求,我基本上是在尝试在我的应用程序中实现 IP 阻止列表以阻止垃圾邮件发送者,并且我不想返回任何响应(只需忽略该请求) ,这在 ASP.NET 中可能吗?
编辑:一些答案建议我可以将它们添加到防火墙中,虽然这肯定会更好,但不适合我的情况。长话短说,我在我的网站上添加了一个审核部分,审核员将在其中检查等待审核的帖子是否有垃圾邮件(由垃圾邮件过滤器过滤),我希望将某些帖子的发件人的 IP 添加到一旦帖子被版主标记为垃圾邮件,就会出现被阻止的 IP 列表,这就是我想在应用程序中执行此操作的原因。
编辑:调用 Response.End() 向用户返回响应(即使它是空的),我问题的全部目的是如何不返回任何响应。这可能吗(即使是出于好奇)?还有 Response.Close() 会关闭套接字,但在执行此操作时会发送通知(在 TCP/IP 中),我只是想忽略它,因为它从未收到过(即不向用户发送任何内容)
谢谢
对于这种类型的事情,我会使用 HTTP 模块,而不是使用处理程序或页面来执行此操作。
为什么使用模块而不是处理程序? HTTP 模块在请求管道中较早被调用。对于这些类型的黑名单请求,您希望尽早且快速地删除请求。这意味着您越早在请求中删除请求越好。
您可以在这里阅读更多有关模块与处理程序的信息。
Response.Clear();
Response.End();
编辑: 这可能更好地实现为 HTTPModule 而不是处理程序,但基本思想是正确的。请参阅 http://www.kowitz.net/archive/2006/03/08/ihttpmodule-vs-ihttphandler.aspx 了解更多详细信息
伪代码 - 未经测试
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
}
显然,如果您希望它返回 HTTP 200(OK)和空白页面,只需删除引用 StatusCode 和 Status 的两行即可。
然后在web.config中注册
<httpHandlers>
<add verb="*"
path="*"
validate="false"
type="MyNamespace.IgnoreHandler, MyAssembly" />
</httpHandlers>
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();
}
}
}
希望这可以节省您一些时间
throw new HttpException(404, "File not found - " + Request.AppRelativeCurrentExecutionFilePath);
我认为这对于说服另一端的人放弃并离开非常有效。
http://www.angrypets.com/tools/rdos/,出于类似的原因,它的功能与您正在谈论的类似,并且是作为模块实现的。
据我所知,实现您想要的效果的最佳方法是使用像
HttpContext.Abort()
,它只是关闭连接。