【问题标题】:Is there a way to delay an HTTP response in ASP.NET MVC 4 without using Thread.Sleep?有没有办法在不使用 Thread.Sleep 的情况下延迟 ASP.NET MVC 4 中的 HTTP 响应?
【发布时间】:2012-11-28 12:24:56
【问题描述】:

我想延迟我的网站身份验证请求的响应,以便服务器在收到请求时的特定秒数偏移处开始响应。

例如,如果用户在04:00:00 进行身份验证,我希望回复在04:00:05 返回,而不是迟早。如果代码不可能赶上截止日期,我希望它会导致错误。

这必须在服务器端完成,我想避免使用Thread.Sleep。不过,我在想可能有一种方法可以使用异步控制器并在请求的继续部分中使用 Thread.Sleep

这里有人遇到过类似的挑战吗?您的解决方案是什么?

你们中的任何人都可以想出一种方法来做到这一点,同时避免Thread.Sleep 并保持响应能力吗?

【问题讨论】:

  • 你为什么要这样做?
  • “不早不晚”?网络(不)可靠性呢?
  • @Dai 身份验证尝试的响应时间可用于确定有关 Web 应用程序逻辑停止位置的各种信息。例如,您可以通过测量用户名是否比已知不存在的用户名更快地返回来测试用户名是否存在于数据库中。我有一个多阶段身份验证方案,其中有太多变量,无法使它们中的每一个都能抵抗此类攻击。我只是想根据最短和最长时间来指定这些操作需要多长时间。不考虑延迟,因为它是一个不可控的变量。
  • @Ian 我只关心动作何时开始和停止,而不是需要多长时间才能被接收或响应需要多长时间才能被传回。由于网络延迟超出了操作的范围,所以这无关紧要。严格来说,这是完成内部身份验证操作所需的时间。希望澄清一点!

标签: c# asp.net


【解决方案1】:

您可以在 MVC 4 中使用 the Async support(如果您使用的是 MVC 3,则可以使用 AsyncController)

public async Task<ActionResult> GizmosAsync()
{
    var gizmoService = new GizmoService();
    return View("Gizmos", await gizmoService.GetGizmosAsync());
}

await 中的方法然后可以使用它需要的时间,包括 Thread.Sleep。

这样,您就不会阻止 ASP.net 处理其他请求。

【讨论】:

  • +1 这是我在问题中提到的一直在考虑做的事情。如果没有其他人站出来,我会打勾。在 MVC 4 中似乎非常优雅,因为您不需要整个 AsyncController fud。
【解决方案2】:

您可以使用自定义的 ActionFilters。

  • 在 OnActionExecuting 方法中记录请求到达的时间。
  • 然后在 OnResultExecuted 方法上检查结果。如果是有效响应,则让它通过,如果是未经授权的响应,则使用 Thread.Sleep 延迟它,并根据记录的开始时间使用所需的延迟。

只要确保您的过滤器在授权过滤器之前运行([Authorize] ?),或者如果您使用全局过滤器而不是属性,则在它之前注册。

这样延迟对授权用户没有影响,我认为这是您不想使用 Thread.Sleep 的原因。请注意,默认情况下 Thread.Sleep 不是很准确(大约 20 毫秒),但客户端的网络延迟应该会掩盖这一点。

【讨论】:

  • +1 因为它与众不同。然而,它似乎以一种附加的方式限制了所有不同的未经授权的用户。如果一个响应处于休眠状态而其他响应进入队列,则它们以 8 个为一组返回。如果我有 1024 个请求,最后一个请求将在 129 秒后返回。
  • 嗯,是的,忘记了可能的线程分配问题。这发生在 IIS/IIS Express 上还是您使用的是内部 http 服务器?可能有一个运行 8 个并发线程的阈值,这可能会在某些配置参数中提高,但对于生产服务器中的默认值来说似乎有点低。
  • 我希望有某种方法可以使动作过滤器异步并使用 Task.Delay 而不是 sleep 来解决这个问题,但显然 MVC4 不支持(目前):stackoverflow.com/questions/12482338/…
  • 已编辑。我说得太快了,没有把所有的东西都读两遍!我在身份验证操作中使用了Task.Delay 而不是Thread.Sleep,这正是我所需要的。我没有注意到您评论中的“[...] 异步操作过滤器”部分,而是跳入测试,它按照我描述的方式工作。这正是我所需要的。
猜你喜欢
  • 2022-06-10
  • 2018-01-20
  • 1970-01-01
  • 1970-01-01
  • 2012-05-14
  • 2010-10-23
  • 2017-03-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多