以下是设置:
1个运行C#app的Web服务器,我的用户(存储在所述服务器上的MySQL数据库中)进行身份验证。
运行软件TBD的1个文件服务器。在过去,我使用lighttpd和mod_secdownload来保护文件服务器上的文件,并且运行良好(ish)。
我想知道是否有办法使用IIS和C#.Net的组合来完成此操作。我的所有其他服务器都运行该组合,如果我可以对文件服务器执行相同操作,它会简化一些事情。踢球者是,托管的文件很大。我见过人们使用小应用程序创建FileStream对象,读入文件并手动创建HTTP响应的示例。这可行,但由于我正在使用500+ MB大小的文件,因此它很慢。我可能会有300名用户同时点击该框,请求文件。这不好。
那么,有人看到这个方法吗?我正在尝试创建一个更透明的系统,如果我的所有服务器都运行相同的软件/硬件,它将使我的生活变得更加简单。提前感谢你给出的任何建议!
答案 0 :(得分:6)
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支持,允许您访问文件,就好像它们直接存储在数据库中但实际驻留在文件服务器上一样。然后,其他帖子的信息可以帮助您将其发送给用户。