我有一些c#代码正在通过HttpWebRequests向我的apache服务器上传一些文件。在上传过程中,我可以使用ls -la
查看不断增长的文件大小。
现在,如果我拉我的计算机网络电缆,部分文件上传仍然在服务器上。
但是,如果我只是关闭我的c#app,则会删除部分文件!
我认为这是由于我的流优雅地关闭了。我该如何防止这种行为?无论上传应用的行为如何,我都希望保留部分文件上传。
我试图使用析构函数abort
我的请求流,并调用System.Environment.Exit(1)
,这两者都没有任何效果。
答案 0 :(得分:3)
拉网线永远不会等同于中止流或关闭套接字,因为它在较低的OSI level中失败。
每当应用程序关闭时,网络会话将中止,并且任何待处理的操作都将被取消。除非您以编程方式拆分文件传输,否则我认为没有任何解决方法 较小的块并保存它们(这样你就可以进行手动增量传输,但它需要一些代码服务器端)。
答案 1 :(得分:1)
编写一个非常简单的HTTP代理,该代理不断接受连接,但从不关闭与服务器的连接
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