2012-03-16 28 views
3

私は、HttpWebRequests経由でApacheサーバにファイルをアップロードしているC#コードをいくつか持っています。アップロード中は、ファイルサイズが大きくなるのを確認するためにls -laを使用できます。部分的なファイルアップロードが自動的に削除される

ここで、たとえばコンピュータのネットワークケーブルを引き出すと、部分的なファイルのアップロードがサーバーに残ります。

しかし、私は単純に私のC#アプリを閉じると、部分的なファイルが削除されます!

私のストリームが正常に閉じられているために発生していると思われます。どのように私はこの動作を防ぐことができますか?アップロードするアプリの動作に関係なく、部分的なファイルのアップロードを維持したい。

私は、abort要求ストリームにデストラクタを使用しようとしましたが、System.Environment.Exit(1)はどちらも効果がありませんでした。

+2

これは、サーバー側のコードによって異なります。 – SLaks

+0

サーバーサイドコードはありません。HTTPプットだけです。 – Julien

+2

つまり、サーバーサイドコードはApache自体にあります。 – SLaks

答えて

3

ネットワークケーブルを引っ張ると、ストリームが中止されたり、ソケットが閉じられたりすることはありません。これは、下位のエラーであるOSI levelです。

アプリケーションが終了するたびに、ネットワークセッションが中止され、保留中の操作はキャンセルされます。 のファイル転送をプログラムで分割して、小規模なチャンクを作成して保存しない限り、回避策はないと思います(手動増分転送が必要ですが、サーバー側でコードが必要になります)。

+0

進行中のアップロードを中止できるiOSアプリがあります。ファイルはサーバー上に残ります。私のC#アプリだけがこのように動作します。私は、ファイルが消滅した後でなければ削除されていないことに気付きました。 – Julien

+0

コードを投稿できますか? – Strillo

+0

これは私が使っているライブラリです: https://github.com/kvdb/WebDAVClient/blob/master/WebDAVClient/WebDAVClient.cs – Julien

0

これは愚かな提案かもしれませんが、アプリケーションが終了している間にProcess.GetCurrentProcess().Kill();に電話するとどうなりますか?

+0

効果がありません。このファイルは、アプリケーションのデストラクタから脱出するか、この場合はKillコマンドを抜けるまで、サーバから削除されません。 – Julien

1

の接続を受け入れることを続けて、非常に単純なHTTPプロキシを書くが、あなたのサーバーへの接続を閉じたことがない使用して

さらに簡単、

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

次に接続する(これはただ一つの接続を受け入れますが)netcat1.10あなたのC#クライアントからlocalhost:12345

0

部分アップロードの処理を見る前に、テストで開始するwhether turning keepalives on in Apache configurationは部分アップロードを受け取るという問題を解決します。

これは、接続が少なくて済み、その部分データを処理する必要性が少ないという効果があります。このような切断は、クライアント、サーバーによるものかもしれませんが、しばしばファイアウォールなどの中間ノードによるものです。キープアライブ・オプションは、安定した「ダミー」トラフィック(0バイトのデータ・ペイロード)を維持する効果があり、接続がまだ生存していることをすべての関係者に通知します。

大量の同時負荷のあるサイトでは、キープアライブはデフォルトでオフになっているため、悪いことです。このオプションは、Apacheの接続管理をはるかに複雑にし、最適化された接続の再利用を防ぎます。また、余分なネットワークトラフィックもあります。しかし、おそらく、これが懸念されない特殊なユースケースがあります。

キープアライブは、クライアントがすぐにクラッシュする傾向がある場合(つまり、常にアップロードが順調に進行している場合)には、まったく役に立ちません。問題がネットワーク関連のものであれば、彼らはあなたを助けるかもしれません。

クライアントがアップロードされたチャンク間で長い遅延を伴って徐々にデータを生成すると、彼らは大いに役立ちます。

+0

ありがとうございます。私はiPhoneアプリを持っているだけでなく、IT Hit試行版(http://www.webdavsystem.com/client)も必要なだけ正確に実行しています。つまり、iphoneアプリ(シミュレータで実行中)を強制終了するか、ctrl-alt-delまたは単にXを使用してIT Hitのc#アプリを強制終了し、アップロードされる部分ファイルはサーバーに残ります。これは、私が必要とするものが可能であることを示しています。私のカスタムC#アプリはこのように動作しません。部分的なアップロードはすべて、サーバーが閉じられたときにすぐにサーバーから削除されます。私はApacheが問題ではないと確信しています。 – Julien

0

アプリを殺す/中止するときに

void FinishUpload(IAsyncResult result) {…} 

line 240)にあなたのアプリケーションの手順場合、確認しましたか?もしそうなら、あなたはコールバックを入力しないと考えるかもしれません。これはちょっと汚いですが、掘削を開始する場所を与えるかもしれません。

+0

それはその機能に入ることはありません。 – Julien

+0

そして、@AnthonyBlakeのように、SendChunked方向を指しています。 – fragmentedreality

関連する問題