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

时间:2010-02-01 18:17:10

标签: c# .net iis download

以下是设置:

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

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

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

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

4 个答案:

答案 0 :(得分:6)

你知道吗? 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();
}

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

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

FILESTREAM Storage in SQL Server 2008