10

デジタル写真をラップトップから Web サーバーに送信する、継承したアプリを再設計しています。アイデアは、「フィールドで」写真を撮り、それらをすぐに Web ページに公開することです (いくつかのより洗練された機能を備えています)。

典型的なシナリオ
1. 写真は、標準の USB を使用してカメラからラップトップに転送されます。
2. 写真はさまざまな方法で処理されます。(重要ではありません)
3. 各写真は、標準の Apache Web サーバーへの webrequest を使用して小さな断片 (それぞれ ~64 kb) で POST され、そこで再び結合されます。

現在の設計の問題点は、ネットワーク接続が不安定な場合に頻繁にハングすることです。モバイル ネットワーク (3G) を使用していて、しばしば圏外になるため、これを適切に処理する方法が必要です。

私の質問は、接続が時々切断されたときにアプリがハングしない、これを行うためのより良い解決策があるかどうかです。

(おまけの質問は、ラップトップでハイキングすることなく、これを適切に単体テストする方法です。)

EDIT 2008-11-24: NetLimiter と TMnetsim (フリーウェア) の組み合わせを使用して、適切なテスト環境をセットアップすることができました。5 kb/秒に設定して、すべてのパケットの 1% をドロップしようとしましたが、私のアプリは新しい設計でも問題なく動作します。

EDIT 2008-12-11: これを行った方法を更新するだけです。カメラが検出されるたびに開始され、カメラから PC に写真をコピーする 1 つのバックグラウンド ワーカー (以下に示す) を作成しました。次に、非同期 HTTP 転送を使用してアップロードするファイルが PC に到着したときに、別のバックグラウンド ワーカーを開始しました。特に操作はいつでも「キャンセル可能」でなければならないため、すべてを正しく行うのは確かに苦痛でした...しかし、とにかく、今では機能しています。私を助けてくれたすべての人に感謝します!

4

7 に答える 7

2

応答が受信されるまで実際にブロックしたい場合を除いて、UIを持つスレッドからHTTPを使用することはまったく避けたいと思います。必要な限り実行されるバックグラウンドスレッドから同じロジックを使用してみることができます。接続が失われたとき(おそらくタイムアウトから)を検出し、再接続するまで定期的(ただし頻繁ではない)間隔で再試行するロジックを必ず用意してください。

あなたの最善の策は、写真がデバイスのドロップボックスディレクトリに保存されると写真をアップロードする、ある種のバックグラウンドワーカープロセスを作成することです。ただし、.NETベースのバックグラウンドプロセスを作成することは簡単ではありません。

于 2008-11-30T07:21:12.473 に答える
1

ラップトップを現場に持ち出さずにこれをテストする方法:予備のマシンでm0n0wallを試し、帯域幅を圧迫してパケットをドロップするようにファイアウォール ルールを設定します。

または、サーバー/クライアントにnetlimiterをインストールします

于 2008-11-11T13:34:54.443 に答える
1

おそらく、WebRequest.GetResponse の代わりに WebRequest.BeginGetResponse を使用する必要があります、応答をキャンセルする方法はないようです (WebRequest を破棄すると役立つ場合があります)。

また、WebRequestのTimeoutプロパティを試してみることもできます

于 2008-11-11T13:11:56.160 に答える
1

まず、ハングしている理由を見つけます。リクエストはただそこにあるのでしょうか? 彼らはタイムアウトしますか?タイムアウト設定を下げるとどうなりますか?

UI スレッドから POST を実行していますか? (それをしないでください:)

非常に短いタイムアウトでハートビート要求を行うことで、接続の切断を検出できる可能性もあります。

于 2008-11-11T12:31:14.963 に答える
0

まず、転送プロセスをアプリケーションの外に置きます。最後の転送の途中から転送を再開できるユーティリティを使用してファイルを同期します。

ある種のファラデーケージを使用して、通信の低下をシミュレートできます。

于 2008-11-11T12:34:57.280 に答える
0

同期フレームワークを見たことがありますか?

それがお役に立てば幸いです、ブルーノ・フィゲイレド

于 2008-11-11T12:42:39.713 に答える
0

データ転送用の ADO.NET 同期サービスで ASP.NET キャッシュ技術を使用してみます。

最初に画像をバイナリまたは BLOB 形式にキャッシュし、ローカル CE データベース (または Express) に保存してみてください。次に、WebServices を介してデータを中央サーバー データベースに同期します。

キャッシュされた画像の転送を処理する集中型の Web サービスを作成してみてください。

Web サービスは、「時々接続する」シナリオで同期サービスを介してデータを受信します。

単体テストの場合は、ダイヤルアップ接続で仮想マシン (VMware) またはラップトップを使用してみてください。

于 2008-12-01T00:40:05.917 に答える