Защита больших загрузок с использованием C # и IIS 7 - PullRequest
9 голосов
/ 01 февраля 2010

Вот настройки:

  • 1 веб-сервер, на котором запущено приложение C #, к которому аутентифицируются мои пользователи (хранящиеся в базе данных MySQL на указанном сервере).

  • 1 файловый сервер с программным обеспечением TBD. В прошлом я использовал lighttpd и mod_secdownload для защиты файлов на файловых серверах, и это работало хорошо (ish).

Мне интересно, есть ли способ сделать это, используя комбинацию IIS и C # .Net. Все остальные мои серверы работают под этим комбо, и это немного упростило бы ситуацию, если бы я мог сделать то же самое для файловых серверов. Главное, файлы, которые размещаются, большие. Я видел примеры людей, использующих небольшое приложение для создания объекта FileStream, чтения в файле и создания HTTP-ответа вручную. Это работает, но так как я работаю с файлами размером более 500 МБ, это очень медленно. И потенциально у меня будет сразу 300 пользователей, которые будут запрашивать файлы. Это не хорошо.

Так, кто-нибудь видит способ обойти это? Я пытаюсь создать более прозрачную систему, и если на всех моих серверах используется одно и то же программное и аппаратное обеспечение, это сделает мою жизнь намного проще. Заранее благодарим за любой совет, который вы дадите!

Ответы [ 4 ]

6 голосов
/ 01 февраля 2010

Знаешь что? Статья в КБ пу. Вот моя официальная рекомендация:

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 голос
/ 01 февраля 2010

В этой теме есть мое решение снизить потребление памяти, пока пользователи загружают файлы. Возможно, вам нужен больший буфер, чем в моем примере.

0 голосов
/ 01 февраля 2010

Хотя это не применимо напрямую, так как вы используете MySql, но это нужно учитывать (может даже быть доступно бесплатно с использованием SQL Server 2008 Express). Sql Server 2008 предлагает поддержку Filestream, которая позволяет вам получать доступ к файлам так, как будто они непосредственно хранятся в базе данных, но фактически находятся на файловом сервере. Тогда информация о других сообщениях может помочь вам донести ее до пользователя.

FILESTREAM Хранилище в SQL Server 2008

0 голосов
/ 01 февраля 2010

Возможно, вас заинтересует фоновая интеллектуальная служба передачи (BITS) Microsoft.

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

В версии 2.5 введена HTTP-аутентификация через сертификаты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...