部分文件上传被自动删除

时间:2012-03-16 20:21:56

标签: c# apache http

我有一些c#代码正在通过HttpWebRequests向我的apache服务器上传一些文件。在上传过程中,我可以使用ls -la查看不断增长的文件大小。

现在,如果我拉我的计算机网络电缆,部分文件上传仍然在服务器上。

但是,如果我只是关闭我的c#app,则会删除部分文件!

我认为这是由于我的流优雅地关闭了。我该如何防止这种行为?无论上传应用的行为如何,我都希望保留部分文件上传。

我试图使用析构函数abort我的请求流,并调用System.Environment.Exit(1),这两者都没有任何效果。

6 个答案:

答案 0 :(得分:3)

拉网线永远不会等同于中止流或关闭套接字,因为它在较低的OSI level中失败。

每当应用程序关闭时,网络会话将中止,并且任何待处理的操作都将被取消。除非您以编程方式拆分文件传输,否则我认为没有任何解决方法 较小的块并保存它们(这样你就可以进行手动增量传输,但它需要一些代码服务器端)。

答案 1 :(得分:1)

编写一个非常简单的HTTP代理,该代理不断接受连接,但从不关闭与服务器的连接

更简单,使用netcat 1.10(虽然这只接受一个连接)

nc -q $FOREVER -l -p 12345 -c 'nc $YOUR_SERVER 80'

然后将您的C#客户端连接到localhost:12345

答案 2 :(得分:0)

这可能是一个愚蠢的建议,但如果您在申请被关闭时致电Process.GetCurrentProcess().Kill();该怎么办?

答案 3 :(得分:0)

在查看部分上传文件的处理之前,请先通过测试whether turning keepalives on in Apache configuration来解决接收部分上传的问题。

这可能会减少断开连接,从而减少处理其部分数据的需要。这种断开可能是由于客户端,服务器,但通常是由于诸如防火墙之类的中间节点。 keepalives选项具有保持稳定的“虚拟”流量(0字节长数据有效负载)的效果,从而向所有各方通告该连接仍然存在。

对于具有大量并发负载的大型站点,Keepalive是一件坏事,这就是为什么它们默认关闭的原因。该选项使Apache的连接管理变得更加复杂,妨碍了优化的连接重用,并且还有一些额外的网络流量。但也许你有一个专门的用例,这不是一个问题。

如果您的客户过早崩溃(也就是说,如果您始终看到上传的稳定进展),Keepalives将永远不会帮助您。如果问题与网络相关,它们可能会对您有很大帮助。

如果您的客户逐渐生成数据,并且上传的数据块之间存在长时间延迟,他们会为您提供极大的帮助。

答案 4 :(得分:0)

如果你的申请进入

,你有没有检查过
void FinishUpload(IAsyncResult result) {…}

line 240)何时中止/查杀应用?如果是这样,您可以考虑不输入回调。这有点脏,但可能会给你一个开始挖掘的位置。

答案 5 :(得分:0)

Apache是​​否支持HTTPRequest的SendChunked属性?

如果是这样,值得尝试。

http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.sendchunked.aspx