如何在ASP.NET中删除/放弃请求?

时间:2008-11-10 02:12:21

标签: asp.net

我正在试图弄清楚如何删除/丢弃请求,我基本上是在我的应用程序中实现阻止的IP列表以阻止垃圾邮件发送者,我不想返回任何响应(只是忽略了请求),这可能在ASP.NET?

编辑:有些答案表明我可以将它们添加到防火墙中,而这肯定会更好,它不适合我的情况。长话短说,我正在我的网站上添加一个审核部分,主持人会检查等待审核垃圾邮件的帖子(由垃圾邮件装配工过滤),我希望将某些帖子的发件人的IP添加到主持人将帖子标记为垃圾邮件后阻止的IP列表,这就是我想在应用程序中执行此操作的原因。

编辑:调用Response.End()向用户返回一个响应(即使它是空的),我的问题的全部目的是如何不返回任何响应。这是否可能(即使是出于好奇)?还有Response.Close()关闭套接字,但是当它执行此操作时它会发送通知(在TCP / IP中),我只是想忽略它,因为它从未收到(即不向用户发送)

由于

9 个答案:

答案 0 :(得分:4)

对于这类事情,我会使用 HTTP Module 而不是使用处理程序或页面执行此操作。

为什么要使用模块而不是处理程序?在请求管道中先前调用HTTP模块。对于这些类型的黑名单请求,您希望尽早并尽快删除请求。这意味着您可以删除请求的请求越早越好。

您可以阅读有关模块与处理程序here的更多信息。

答案 1 :(得分:3)

也许你可以使用

Response.Clear();
Response.End();

答案 2 :(得分:2)

我的第一个想法是约翰建议的。如果您有权访问它,那么最理想的解决方案是将这些IP添加到防火墙中被阻止的IP列表中,这样您的应用程序就不必进行任何处理了。

答案 3 :(得分:2)

编辑:这可能更好地实现为HTTPModule而不是处理程序,但基本思想仍然适用。有关详细信息,请参阅http://www.kowitz.net/archive/2006/03/08/ihttpmodule-vs-ihttphandler.aspx


您可以使用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
}

显然,如果您希望它返回HTTP 200(OK)和空白页面,只需删除引用StatusCode和Status的两行。

然后在web.config中注册

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

答案 4 :(得分:0)

我建议最好的解决方案不是给出具体的“无响应”,而是给出更令人沮丧的标准http错误消息。每当我试图阻止未经授权的用户时,我发出如下页面/网址未找到的消息:

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

我认为这可以说服另一端的人放弃和离开。

答案 5 :(得分:0)

您可能希望看一下这个http://www.angrypets.com/tools/rdos/,它与您所说的内容类似,出于类似的原因,并作为模块实现。

答案 6 :(得分:0)

另一种令人烦恼但又简单易行的方法就是在关闭请求之前暂停一段时间。

答案 7 :(得分:0)

AFAIK没有办法在没有回复的情况下直接删除请求。您可以使用您喜欢的任何线程休眠技术保持请求在ASP.NET中旋转,但是您不会以这种方式为您的服务器提供更好的生活。

我知道实现您想要的最佳方式是让ZXTM之类的流量管理器在请求到达网络服务器之前关闭请求。

答案 8 :(得分:0)

你走了:

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();
        }
    }
}

希望这能节省你一些时间