我有一个WCF服务,使客户端下载一些文件并发数据流。尽管每个客户端的请求都有一个新的服务实例,但如果两个客户端尝试同时下载同一个文件,则首先到达的请求会锁定该文件直到完成该文件。所以另一个客户端实际上是在等待第一个客户端完成,因为没有多个服务。必须有办法避免这种情况。我可以有一个物理文件
是否有任何人谁知道我怎样才能避免这种情况,而无需在服务器上的硬盘多份文件?还是我在做一些完全错误的事情?
这是服务器端代码:
`公共流DownloadFile(字符串路径) { System.IO.FileInfo的fileInfo =新System.IO.FileInfo(路径);
// check if exists
if (!fileInfo.Exists) throw new FileNotFoundException();
// open stream
System.IO.FileStream stream = new System.IO.FileStream(path, System.IO.FileMode.Open, System.IO.FileAccess.Read);
// return result
return stream;
}`
这是客户端代码:
public void Download(string serverPath, string path)
{
Stream stream;
try
{
if (System.IO.File.Exists(path)) System.IO.File.Delete(path);
serviceStreamed = new ServiceStreamedClient("NetTcpBinding_IServiceStreamed");
SimpleResult<long> res = serviceStreamed.ReturnFileSize(serverPath);
if (!res.Success)
{
throw new Exception("File not found: \n" + serverPath);
}
// get stream from server
stream = serviceStreamed.DownloadFile(serverPath);
// write server stream to disk
using (System.IO.FileStream writeStream = new System.IO.FileStream(path, System.IO.FileMode.CreateNew, System.IO.FileAccess.Write))
{
int chunkSize = 1 * 48 * 1024;
byte[] buffer = new byte[chunkSize];
OnTransferStart(new TransferStartArgs());
do
{
// read bytes from input stream
int bytesRead = stream.Read(buffer, 0, chunkSize);
if (bytesRead == 0) break;
// write bytes to output stream
writeStream.Write(buffer, 0, bytesRead);
// report progress from time to time
OnProgressChanged(new ProgressChangedArgs(writeStream.Position));
} while (true);
writeStream.Close();
stream.Dispose();
}
}
catch (Exception ex)
{
throw ex;
}
finally
{
if (serviceStreamed.State == System.ServiceModel.CommunicationState.Opened)
{
serviceStreamed.Close();
}
OnTransferFinished(new TransferFinishedArgs());
}
}
你是如何读/文件发送到客户端?请显示一些代码。 – 2011-02-25 13:38:08
Sory,这里是服务器端功能和客户端功能。 – 2011-02-25 14:10:21