У меня есть служба wcf, которая позволяет клиентам загружать некоторые файлы. Хотя для каждого запроса клиента существует новый экземпляр службы, если два клиента пытаются загрузить один и тот же файл одновременно, первый поступающий запрос блокирует файл до тех пор, пока он не будет завершен. Таким образом, другой клиент фактически ожидает завершения работы первого клиента, так как нет нескольких служб. Должен быть способ избежать этого.
Есть ли кто-нибудь, кто знает, как я могу избежать этого, не имея нескольких файлов на жестком диске сервера? Или я что-то не так делаю?
это код на стороне сервера:
`public Stream DownloadFile (путь строки)
{
System.IO.FileInfo fileInfo = new 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());
}
}