使用C#和IIS 7保护大型下载

这是设置:

  • 1个运行C#应用程序的Web服务器,我的用户(存储在所述服务器上的MySQL数据库中)进行身份validation。

  • 1个运行软件TBD的文件服务器。 在过去,我使用lighttpd和mod_secdownload来保护文件服务器上的文件,并且它运行良好(ish)。

我想知道是否有办法使用IIS和C#.Net的组合来做到这一点。 我的所有其他服务器都运行该组合,如果我可以对文件服务器执行相同操作,它会简化一些事情。 踢球者是,托管的文件很大。 我见过人们使用小应用程序创建FileStream对象,读入文件并手动创建HTTP响应的示例。 这可行,但由于我正在处理500+ MB大小的文件,所以它很慢。 我可能会有300名用户同时点击该框,请求文件。 那不好。

所以,有人看到这个方法吗? 我正在尝试创建一个更透明的系统,如果我的所有服务器都运行相同的软件/硬件,它将使我的生活变得更加简单。 在此先感谢您提供的任何建议!

你知道吗? KB文章是便便。 这是我的官方建议:

public void StreamFile(string filePath) { string fileName = Path.GetFileName(filePath); using (var fStream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read)) { var contentLength = fStream.Length; if (Request.UserAgent.Contains("MSIE")) { Response.AddHeader("Content-Transfer-Encoding", "binary"); } Response.ContentType = "application/octet-stream"; Response.AddHeader("Content-Length", contentLength.ToString()); // Even though "Content-Disposition" should have an upper-case "d", as per http://www.ietf.org/rfc/rfc2183.txt // IE fails to recognize this if the "d" is upper-cased. Response.AddHeader("Content-disposition", "attachment; filename=" + fileName); var buffer = new byte[8192]; while (Response.IsClientConnected) { var count = fStream.Read(buffer, 0, buffer.Length); if (count == 0) { break; } Response.OutputStream.Write(buffer, 0, count); Response.Flush(); } } Response.Close(); } 

这个post有我的解决方案,可以在用户下载文件时降低内存使用率。 但是,您可能需要比我的样本使用更大的缓冲区。

您可能对Microsoft的后台智能传输服务(BITS)感兴趣。

http://msdn.microsoft.com/en-us/library/bb968799%28VS.85%29.aspx

2.5版通过证书引入了HTTP身份validation。

虽然这不是直接适用的,因为您使用的是MySql但需要考虑的事情(甚至可以通过使用sql server 2008 express免费提供)。 Sql Server 2008提供了Filestream支持,允许您访问文件,就好像它们直接存储在数据库中但实际驻留在文件服务器上一样。 然后,其他post的信息可以帮助您将其提供给用户。

SQL Server 2008中的FILESTREAM存储