2

http リクエストを使用してサーバーへのファイルのアップロードを容易にするアプリケーションがあります。ファイルのアップロードには HttpSendRequestEx と HttpEndRequest を使用しています。そして、それはうまく機能しています。また、アップロードは別のスレッド内で実行されます。アップロードするファイルを 1 つずつ処理します。

新しい要件は、ユーザーがいつでもアップロードをキャンセルできるようにすることです。現在、アップロードはスレッド内で実行されるため、それを制御することはできません。

回避策として、私が行ったことは、ユーザーがアップロードをキャンセルするボタンをクリックすると、次の HINTERNET ハンドル

  hSession returned from InternetOpen
  hConnect returned from InternetConnect
  hRequest returned from HttpOpenRequest

InternetClosehandle 関数を使用して閉じられました。

これらのハンドルはスレッド内で使用されるため、直接アクセスすることはできません。したがって、これらをスレッドが実行されるクラスの静的メンバーとして宣言しました。ボタンクリックが発生したときに直接アクセスできるようにします。

これにより、処理中のリクエストはすぐにキャンセルされます。しかし、これが良い方法かどうかはわかりません。したがって、このロジックを進める上でセキュリティ上の問題があるかどうかを知りたい..

また、これよりも優れたオプションはありますか....

これについてコメントをよろしくお願いします。これに関する専門家のアドバイスを期待しています..

前もって感謝します

4

1 に答える 1

2

TCPソケットの観点からは、これは要求を中断する正しい方法です。別のスレッドで何らかの作業を行っている接続を停止して閉じるためにソケットを閉じることは完全に合法です。

とはいえ、WinInetは単なるソケットのラッパーではないため、リソースやメモリリークがないことを確認することはできません。

このような中断されたアップロードを多数作成するテストプログラムを作成してテストし、ProcessExplorerのプロセスの[パフォーマンス]タブでリソースリークを探します。私は特にハンドル数とおそらく仮想メモリも監視します。

また、ハンドルを閉じる前に、HttpEndRequest()を呼び出してHTTP接続を閉じようとすることができます。これにより、さらに多くのことがクリーンになる可能性があります。

于 2012-09-27T06:45:52.077 に答える