Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 进程无法访问该文件<;文件路径>;因为它正被另一个进程使用_C#_.net_Stream_Asmx_Filestream - Fatal编程技术网

C# 进程无法访问该文件<;文件路径>;因为它正被另一个进程使用

C# 进程无法访问该文件<;文件路径>;因为它正被另一个进程使用,c#,.net,stream,asmx,filestream,C#,.net,Stream,Asmx,Filestream,我正在我的ASMX Web服务上上传大文件,并将其分块(小部分)(ASMX不支持流式传输,我没有找到其他方法): 但是在~20-50调用之后的一些文件上,我发现了这个错误:进程无法访问该文件,因为它正被另一个进程使用。 我怀疑这与Windows无法实现该文件有关。有没有办法摆脱这个无聊的错误? 编辑 请求按顺序同步执行 编辑2 客户端代码如下所示: _service.StartUpload(path); ... do { .. bool status = _service.Uploa

我正在我的ASMX Web服务上上传大文件,并将其分块(小部分)(ASMX不支持流式传输,我没有找到其他方法):

但是在~20-50调用之后的一些文件上,我发现了这个错误:
进程无法访问该文件,因为它正被另一个进程使用。

我怀疑这与Windows无法实现该文件有关。有没有办法摆脱这个无聊的错误?

编辑
请求按顺序同步执行



编辑2

客户端代码如下所示:

_service.StartUpload(path);

...
do
{
..
bool status = _service.UploadChunk(buf, path, md5);
if(!status)return Status.Failed;
..
}
while(bytesRead > 0);

_service.CheckFile(path, md5);

每个请求都是独立处理的。仍在访问该文件的进程可能是以前的请求

通常,您应该使用文件传输协议来传输文件。ASMX不适合这样做


而且,我认为您有很好的理由不使用WCF?

选项1:更改需求,这样您就不必使用ASMX来执行此操作。WCF支持我将要试验的流媒体模型,但它应该更有效地满足您的需求

选项2:查看WSE3.0。我没怎么看它,但我认为它扩展了ASMXWeb服务,以支持像DIME和MTOM这样的东西,它们是为传输文件而设计的,因此可能会有所帮助


选项3:设置系统,以便每次调用都将文件的一部分写入不同的文件名,然后编写代码以在末尾重新加入所有内容。

使用此选项创建文件

如果要追加内容,请添加
FileMode.append

var filestreama = new FileStream(name, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite);

在错误发生时使用whockme检查谁在使用该文件。您可以将应用程序置于调试模式并保持断点来执行此操作。这很可能是你的过程


还可以尝试在每次传输之后(以及下一次传输之前)添加延迟,看看是否有帮助。可能您的传输速度太快,并且流仍在使用中,或者在下一次传输到来时被刷新。

我按顺序发送请求。ASMX应满足这些要求。这还提供了发送一些文件(但不是全部:()甚至大于5 GB。@2x:您可能是按顺序发送,但这并不意味着请求是按顺序处理的!而且,这是您代码中对该文件的唯一访问权限吗?您是否重命名、移动、删除该文件?我会捕获上一个请求的状态,如果返回“确定”,我会发送下一个请求。我还会在最后计算结果文件的MD5l请求。@2x:是的,好的,因为它们是单个请求,而不是流式处理。但是,由于路径是在请求中传递的,是否有可能其他客户端也试图上载到同一个文件?不,只有我发送了,并且只从我的本地计算机上载到同一台计算机。另外,只有一个客户端可以开始上载具体的文件。AppendMode不是当块以并行方式出现时,就足够了。块不是以并行方式出现的。它是按顺序出现的。-1:WSE是过时的。不要使用它,当然也不要建议其他人使用它。如果你被迫使用旧技术,你就被迫使用旧技术。我建议首先更改需求是有原因的。
var filestreama = new FileStream(name, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite);