【问题标题】:Handling large concurrent HTTP POSTs in ASP.NET application在 ASP.NET 应用程序中处理大型并发 HTTP POST
【发布时间】:2012-03-30 07:44:37
【问题描述】:

客户端页面使用 javascript 将多部分表单数据(文件)发布到我的 ASP.NET 站点(ashx 处理程序)。

用户选择多个文件并开始并发上传。当文件超过 150MB 时,这会生成 ASP.NET 服务器端的多个并发 POST 处理程序。

我已经实现了会话控制以及验证码功能,以准确知道它是否不是机器人淹没了我的服务器。

但问题在于初始上传开始。

每次处理程序处理POST 时,它都会检查会话的ID(我的自定义会话,每个用户页面一个),并将Request.ContentLength 的大小添加到文件的总大小POSTed每个会话。此数据保存到 XML。

但由于几个初始帖子同时发生,记录字节总和的 XML 写入器“阻塞”并报告所有初始 POSTs 的每个会话 0 字节,因为它们同时进入。

我已经在我的persister 对象上实现了lock(进行 XML 写入),但现在直到一个 POST 完全处理完毕,其他的都无法继续。

此外,即使我对“上传限制之后”传入的请求不做任何事情,它们仍然需要时间将数据上传到服务器。

所以我的问题是:

处理多个并发POST 上传的正确模式是什么?

有没有办法在 ASP.NET 处理程序代码中过滤请求后立即删除 POST,并节省客户端将数据上传到 IIS 的工作?

更新:当locking 仅用于 XML 写入/最大会话长度计算时,我仍然有并发性,这很好。现在我只需要弄清楚如何立即从 ashx 处理程序代码中删除会话。

【问题讨论】:

  • 所有http请求都写入同一个文件吗?听起来像糟糕的设计。您可能需要考虑使用一些消息队列服务来处理这个问题。还建议将数据持久保存到数据库中。
  • 这种情况特别是当在同一个会话中(这意味着在同一个文件夹中)两个同名文件被保存到。至于数据库 - 这是一个好主意,但 HttpPostedFile 有一个 SaveAs 方法,它接受文件系统上的路径。我还没有研究如何使用 ASP.NET 将发布的文件序列化到 DB。

标签: asp.net iis file-upload concurrency http-post


【解决方案1】:

您的 ashx 处理程序是否编写为异步执行?如果没有,这是一篇关于实现异步 ashx 处理程序的好文章:

http://msdn.microsoft.com/en-us/magazine/cc163463.aspx

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-19
    • 1970-01-01
    • 2011-03-04
    • 2019-05-21
    • 2011-05-05
    相关资源
    最近更新 更多