3

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

例如,如果用户在 进行身份验证04:00:00,我希望响应返回到04:00:05,而不是迟早。如果代码不可能在最后期限之前完成,我希望它会导致错误。

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

这里有没有人面临过类似的挑战,你的解决方案是什么?

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

4

2 回答 2

4

您可以使用MVC 4 中的 Async 支持(如果您使用的是 MVC 3,则可以使用 AsyncController)

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

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

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

于 2012-12-11T01:34:25.423 回答
3

您可以使用自定义的 ActionFilters。

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

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

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

于 2012-12-11T01:27:23.280 回答