我收到一个“进程无法访问文件”,因为它正被另一个进程使用。我们的上传处理程序错误。我们正在测试的是通过silverlight的上传器,它以块的形式将数据发送到服务器上的处理程序。一切正常,直到我们测试中断互联网连接,然后重新启用互联网连接(上传器意味着在互联网重新启动时自动恢复)。当互联网连接恢复后处理程序尝试重新打开文件时,错误(“进程无法访问文件”)出现。
有问题的代码在
之下using (FileStream fs = File.Open(context.Server.MapPath("~/Uploads/") + uploadGuidAsString, FileMode.CreateNew, FileAccess.Write, FileShare.None))
{
SaveFile(context.Request.InputStream, fs);
fs.Flush();
}
答案 0 :(得分:1)
TCP套接字只能在实际通过连接发送数据时检测到断开的连接。当您的上传器连接断开时,不会再从远端发送数据。由于您的服务器没有向上传器发送任何数据,服务器只是等待,期望更多数据最终从上传器客户端到达。
我建议您为每个上传者提供一个唯一的ID。如果您看到来自上传者的第二次连接尝试,请手动终止第一个连接。
答案 1 :(得分:0)
您需要一个可以唯一标识上传会话的ID和一个允许上传恢复的协议(GUID?)。在重新连接时,上传者可以发送ID以及它希望恢复的文件中的偏移量。然后,服务器可以使用该ID查找正在处理该上载的类实例,并且像Dark Falcon建议的那样,只需关闭“旧”连接,按照请求移动文件指针并在新连接上恢复流/块。我想你需要一些超时来删除服务器上过时的上传会话对象。您的协议可能必须处理此问题 - 如果客户端在上传会话实例超时并释放后请求恢复,会发生什么?
RGDS, 马丁