2010-02-01 32 views
9

Dưới đây là các thiết lập:Securing tải về Large Sử dụng C# và IIS 7

  • 1 web server chạy một ứng dụng C# để mà người dùng của tôi (được lưu trữ trong một cơ sở dữ liệu MySQL trên cho biết máy chủ) xác thực.

  • 1 máy chủ tệp đang chạy phần mềm TBD. Trong quá khứ, tôi đã sử dụng lighttpd và mod_secdownload để bảo mật các tệp trên máy chủ tệp và nó hoạt động tốt (ish).

Tôi tự hỏi liệu có cách nào để thực hiện việc này bằng cách kết hợp IIS và C# .Net. Tất cả các máy chủ khác của tôi đang chạy combo đó, và nó sẽ đơn giản hóa mọi thứ một chút nếu tôi có thể làm tương tự cho các máy chủ tập tin. Các kicker là, các tập tin đang được lưu trữ là lớn. Tôi đã xem các ví dụ về những người sử dụng một ứng dụng nhỏ để tạo đối tượng FileStream, đọc trong tệp và tạo Phản hồi HTTP bằng tay. Điều này làm việc, nhưng kể từ khi tôi làm việc với các tập tin có kích thước 500+ MB, nó chậm như heck. Và tôi sẽ có khả năng có 300 người dùng nhấn hộp cùng một lúc, yêu cầu tệp. Điêu đo không tôt.

Vì vậy, bất kỳ ai nhìn thấy cách này? Tôi đang cố gắng tạo ra một hệ thống minh bạch hơn, và nếu tất cả các máy chủ của tôi đang chạy cùng một phần mềm/phần cứng, nó sẽ làm cho cuộc sống của tôi trở nên đơn giản hơn rất nhiều. Cảm ơn trước cho bất kỳ lời khuyên nào bạn đưa ra!

+0

Ứng dụng C# của bạn ASP.NET * Webforms * hoặc * MVC *? –

+0

Ứng dụng mà người dùng sử dụng để xác thực là một ứng dụng web C# .Net 3.5. –

Trả lời

6

Bạn biết không? Bài viết KB là poo. Đây là đề xuất chính thức của tôi:

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(); 
} 
+0

Sau khi đưa ra một nỗ lực, có vẻ như tôi vẫn tải tệp đó vào bộ nhớ. Ít nhất, tôi đã được ra khỏi bộ nhớ ngoại lệ khi tôi đã thử nó trên một tập tin 1.5GB, và đã mệt mỏi của chờ đợi cho tải về trên một 450MB. Tôi đang làm điều này trên một máy tính thử nghiệm, không phải là máy chủ tập tin, vì vậy số lượng bộ nhớ tôi phải làm việc với thấp hơn. Máy chủ tệp của tôi có nhiều ram (24GB tôi nghĩ) nhưng tôi muốn một giải pháp không yêu cầu nhiều bộ xử lý hoặc bộ nhớ. Lighttpd thực hiện điều này bằng cách sử dụng mod_secdownload và quy tắc viết lại URL, nhanh và rẻ trên chu kỳ/bộ nhớ. –

+0

@ john - cách tôi đọc mã trong Trình phản xạ, không có phương pháp MS nào để viết tệp thực sự sử dụng bộ đệm nhỏ. Tất cả chúng dường như phân bổ một bộ đệm duy nhất cho toàn bộ tệp. Một số điều này là khá khó để theo dõi, vì vậy có lẽ tôi đang thiếu một cái gì đó. – Ray

+1

@Sheep Slapper: http://support.microsoft.com/kb/812406 – user7116

1

This thread có giải pháp để giảm mức sử dụng bộ nhớ trong khi người dùng đang tải xuống tệp. Bạn có thể muốn có một bộ đệm lớn hơn so với sử dụng mẫu của tôi, mặc dù.

+0

Sau khi đọc chủ đề đó và bài viết Hỗ trợ của Microsoft trong câu trả lời ở trên, tôi sẽ đi theo hướng đó để có giải pháp tạm thời. Nó tốt hơn ở chỗ có ít ứng dụng tham gia vào quá trình này, nhưng nó không minh bạch trong những gì đang xảy ra. Bây giờ tôi chỉ cần phát triển một ứng dụng nhỏ để triển khai và xây dựng phiên bản mod_secdownload của riêng tôi kể từ khi ứng dụng xác thực người dùng của tôi không có trên máy chủ tệp! Cảm ơn bạn về thông tin! –

0

Mặc dù điều này không áp dụng trực tiếp vì bạn đang sử dụng MySql nhưng đó là điều cần xem xét (thậm chí có thể có sẵn miễn phí bằng cách sử dụng máy chủ sql 2008 express). Sql Server 2008 cung cấp hỗ trợ Filestream cho phép bạn truy cập các tập tin như thể chúng được lưu trữ trực tiếp trong cơ sở dữ liệu nhưng thực sự nằm trên một máy chủ tập tin. Sau đó, thông tin về các bài đăng khác có thể giúp bạn nhận được thông tin đó cho người dùng.

FILESTREAM Storage in SQL Server 2008

Các vấn đề liên quan