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

问题描述 投票:0回答:10

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

编辑:一些答案建议我可以将它们添加到防火墙中,虽然这肯定会更好,但不适合我的情况。长话短说,我在我的网站上添加了一个审核部分,审核员将在其中检查等待审核的帖子是否有垃圾邮件(由垃圾邮件过滤器过滤),我希望将某些帖子的发件人的 IP 添加到一旦帖子被版主标记为垃圾邮件,就会出现被阻止的 IP 列表,这就是我想在应用程序中执行此操作的原因。

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

谢谢

asp.net
10个回答
4
投票

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

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

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


3
投票
也许你可以使用

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

2
投票
我的第一个想法是约翰的建议。最理想的解决方案是将这些 IP 添加到防火墙中的阻止 IP 列表(如果您有权访问这些 IP),这样您的应用程序根本不需要进行任何处理。


2
投票

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


您可以使用 httphandler 来完成此操作,这样您就不必担心在应用程序代码中检查这一点 - 它甚至在您的应用程序执行之前就已处理。

伪代码 - 未经测试

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>
    

2
投票
给你:

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

希望这可以节省您一些时间


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

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

我认为这对于说服另一端的人放弃并离开非常有效。


0
投票

0
投票
另一种烦人但简单的方法是在关闭请求之前将请求休眠一段令人沮丧的时间。


0
投票
据我所知,没有办法在没有响应的情况下彻底放弃请求。您可以使用您喜欢的任何线程休眠技术在 ASP.NET 中保持请求旋转,但这样并不能改善服务器的生活。

据我所知,实现您想要的效果的最佳方法是使用像

ZXTM 这样的流量管理器在请求到达网络服务器之前关闭请求。


0
投票
在 ASP.NET Core 中调用

HttpContext.Abort()

,它只是关闭连接。

© www.soinside.com 2019 - 2024. All rights reserved.