2013-12-16 34 views
2

我在这里有一个问题,我希望一些超级专家能够解释。我有一个小HttpHandler。它从查询字符串获取文件ID,从数据库中找到相应的文档路径,并返回响应中的文件内容。从单个文件(“被另一个进程使用”)读取多个请求

相关的代码看起来像下面的东西:

context.Response.Clear(); 
context.Response.AddHeader("content-disposition", "attachment;filename=" + file.DisplayName); 
context.Response.AddHeader("content-type", mimetype); 

string path = context.Server.MapPath(DocumentUploadPath + "/" + file.FileName); 

using (FileStream stream = File.Open(path, FileMode.Open, FileAccess.Read)) 
{ 
    byte[] buffer = new byte[32768]; 
    int bytesRead = 0; 

    while ((bytesRead = stream.Read(buffer, 0, buffer.Length)) > 0) 
    { 
     context.Response.OutputStream.Write(buffer, 0, bytesRead); 
    } 
} 
context.Response.OutputStream.Flush(); 

今天检查我们的错误日志后,我们注意到我们得到一些的IOExceptions线沿线的:

该进程无法访问文件'file_path_here',因为 正被另一个进程使用。

为了测试,我设置了一个简单的Parallel.For循环来尝试访问该文件。果然,这些错误是非常可重复的。它看起来像这样:

static void Main(string[] args) 
{ 
    Parallel.For(0, 1000, ctr => 
    { 
     GetFile(); 
    }); 
} 

static void GetFile() 
{ 
    string fileUrl = "url_to_file.ashx?Id=blah"; 

    HttpWebRequest request = WebRequest.Create(fileUrl) as HttpWebRequest; 

    HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 

    string responseText = ""; 

    using (StreamReader reader = new StreamReader(response.GetResponseStream())) 
    { 
     responseText = reader.ReadToEnd(); 
    } 

    response.Close(); 
    Console.WriteLine(response.StatusDescription); 
} 

我已经修改了处理程序代码重试,如果遇到异常,所以这个问题本身得到缓解,但使我对我的一般问题:

这是怎么回事我的服务器能够发送成千上万的index.html并发副本没有问题,但尝试时会中断(假设没有缓存)?服务器是否为我处理重试信息,或者它是否能以多种方式同时读取index.html?

回答

5

我想,如果添加FileShare.Read它会解决你的问题

见的解释:http://msdn.microsoft.com/en-us/library/system.io.fileshare(v=vs.110).aspx

的一个典型应用此枚举是确定是否两个过程可以从相同的同时读取文件。例如,如果打开文件并指定了读取,则其他用户可以打开文件进行读取,但不能写入。

using (FileStream stream = File.Open(path, FileMode.Open, FileAccess.Read, FileShare.Read)) 
{ 
    ..... 
} 
+1

谢谢,那就是我正在寻找的解决方案。我一直觉得,如果两个进程打开一个只读文件,他们都可以访问它。另一方面,如果一个人开放写作,那么只有该文件可以具有写入权限。看来我对Windows锁定文件的理解是错误的(取决于共享模式:http://msdn.microsoft.com/zh-cn/library/aa363858.aspx)。再次感谢。 –

相关问题