- PR -

C#にてファイルダウンロードのレスポンスが遅い。

1
投稿者投稿内容
ひろひろ
常連さん
会議室デビュー日: 2004/07/23
投稿数: 36
投稿日時: 2006-07-18 22:31
いつもお世話になっております。

.NET フレームワーク上のActiveXで少々不可解な現象が起こっていますので質問させていただきます。(IE上でWindowsコントロールを表示する技術のことです。)

御存知の方いらっしゃいましたら御教授ください。


下記の方法で「Javaで構築されたWebアプリからファイルをダウンロードする」機能を実装しています。

@ C# .NET2003(.NET Framework1.1)にてWebからファイルをダウンロードし、ローカルに保存する機能を持ったユーザーコントロールのDLLプログラムを作成する。

ちなみにダウンロードしている箇所のソースコードを抜粋すると
コード:
----(抜粋)---------------

// リクエスト生成
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "GET";
request.ContentType = REQUEST_CONTENT_TYPE;
request.Timeout = REQUEST_TIMEOUT;
request.CookieContainer = cookieContainer;
request.Proxy = System.Net.GlobalProxySelection.GetEmptyWebProxy();

int errorCode = 0;
Stream inputStream = null;
Stream outputStream = null;
try
{
	//サーバーからの応答を受信するためのWebResponseを取得
	HttpWebResponse response = (HttpWebResponse)request.GetResponse();

	// Streamを取得
	inputStream = response.GetResponseStream();
	outputStream = new FileStream(binaryFilePath , FileMode.CreateNew );

	int i = 0;
	byte[] bytes = new byte[1048576];
	while( (i=inputStream.Read(bytes , 0 , bytes.Length )) > 0 )
	{
		outputStream.Write(bytes , 0 , i);
		this.progressBar.Value += i;
	}
}
catch(Exception e)
{
	throw e;
}
finally
{
	if(outputStream!=null)
	{
		outputStream.Close();
	}
	if(inputStream!=null)
	{
		inputStream.Close();
	}
}

----(抜粋)---------------



こんな感じで普通です。

A 次に@で生成したDLLをWebサーバー上に配置し、ローカルからでもDLLをダウンロードできるようにします。
http://hogehogehost/hoge/hunya.DLL をIEでつつくとDLLダウンロード可能。

B Objectタグをサーバー側HTMLに記述。
コード:
<object 
	classid="http:/hoge/hunya.DLL#HogeHogeControl"
	height="240" width="440" VIEWASTEXT>
</object>


こうすることで、IE上でC#コントロールがロードできます。

C そのコントロールからファイルをダウンロードします。



実は困っているのはCなのです。
Cのファイルダウンロードが異常に遅いのです。



BにてObjectタグを使用してDLLをHTMLに埋め込んでいますがこれをC#の
Formにコントロールを埋めて同じくファイルダウンロードできます。このときのファイルダウンロードにかかった時間に対して
Cでかかった時間はおよそ7倍にもなります。

C#のFormで10秒でダウンロードできるものがIEのActiveX上だと1分10秒かかるのです。



(最初はプログレスバーのカウントアップをしているのですが、そこが遅いと思いこの処理を
外してみましたが速さはほとんど変わらずでした。)

何故こんなにレスポンスに違いが現れるのか御存知の方いらっしゃるでしょうか?
御教授ください。よろしくお願いします。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-07-20 21:54
本題から外れますが。
引用:

コード:

}
catch(Exception e)
{
throw e;
}




この catch ブロックは不要です。
ここで、例外情報をログに書くなどの処理がある場合は、「throw e;」ではなく、「throw;」とします。
「throw e;」だと、確かに同じ例外情報を持った例外を送出しますが、送出元がこの行になり、「どこで、なぜ、例外が発生したのか」がわかりにくくなります。


 あと、クライアント OS はなんでしょう?Windows 2000 以前だと、かなり遅くなることを確認しています。
 帯域をどれくらい使っているか、sniffer 等で確認してみてはどうでしょう?


あれ?ActiveX?
.NET アセンブリを IE でホストする、、、ではなく?

[ メッセージ編集済み 編集者: Jitta 編集日時 2006-07-20 21:56 ]
ひろひろ
常連さん
会議室デビュー日: 2004/07/23
投稿数: 36
投稿日時: 2006-07-20 22:06
引用:

この catch ブロックは不要です。


本当はオリジナルExceptionをnewして投げているのですが、今回投稿するということで、つい適当に書いてしまいました。
誤解させてしまってすみません。。。

しかし、例外についてとてもためになることを知りました。ありがとうございます。

引用:

あれ?ActiveX?
.NET アセンブリを IE でホストする、、、ではなく?


objectタグを使用していたのでてっきりそうだと思ってました。
そういう風に呼ぶんですね。なるほど。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-07-20 22:28
引用:

ひろひろさんの書き込み (2006-07-20 22:06) より:

本当はオリジナルExceptionをnewして投げているのですが、


「オリジナル」を「元の」と勘違いしてしまった(^-^; 「独自の」ですね。


 いわゆる「ノータッチ デプロイメント」になるので、バージョンのチェックなどでたくさんの通信が発生します。その関係も・・・ないな。それは表示するまでの話だもんな。
1

スキルアップ/キャリアアップ(JOB@IT)