我在这里有一个问题,我希望一些超级专家能够解释。我有一个小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?
谢谢,那就是我正在寻找的解决方案。我一直觉得,如果两个进程打开一个只读文件,他们都可以访问它。另一方面,如果一个人开放写作,那么只有该文件可以具有写入权限。看来我对Windows锁定文件的理解是错误的(取决于共享模式:http://msdn.microsoft.com/zh-cn/library/aa363858.aspx)。再次感谢。 –