サーバサイドのexeを実行する

2006-04-08
このエントリーをはてなブックマークに追加

時間のかかる重たい処理なんかはサーバサイドに用意しておいたexeを非同期でつついたほうがいい場合があります。当然ながらクライアントサイドのexeはつつけませんが、メールの大量送信(スパムではありません)なんかをするときには結構重宝します。

//非同期でexeつつく
System.Diagnostics.Process.Start(“C:¥¥hoge¥¥hoge.exe”);

//同期でexeつつく
System.Diagnostics.Process prExe = System.Diagnostics.Process.Start(“C:¥¥hoge¥¥hoge.exe”);
prExe.WaitForExit();

上のサンプルコードは非同期です。つまり、つついた後は放置です。つつき逃げみたいな感じです。
でも、多分上のサンプルのほうが現実的なような気がします(今回の用途では、という意味で)。

下のサンプルは同期しますが、exeのプロセスが消えるまで「待つだけ」です。ほとんどフリーズと同じです。

//非同期でexeつついて、exeの実行が終了したらイベント起こす
System.Diagnostics.Process prExe = System.Diagnostics.Process.Start(“C:¥¥hoge¥¥hoge.exe”);
prExe.EnableRaisingEvents = true;
prExe.Exited += new EventHandler(prExe_Exited);

private void prExe_Exited(object sender, EventArgs e)
{
//終了したらこのメソッドが呼ばれます
}

このサンプルだと、非同期でexeつついておいて、プロセスが終了したら「終わったよ」というイベントあげてくれます。WEBアプリの場合、サーバからクライアントにイベント通知はできないけど、「処理が終わりました」メールくらいは送れそうです。
まぁ、Windowsアプリ向けの手法でしょうね。

Tags:

ASP.NETでクライアントサイドにランタイムでJavaScriptを書き出す方法

2006-02-07
このエントリーをはてなブックマークに追加

クライアントサイドにランタイムでJavaScriptを書き出す方法です。別に「Response.Write」で書き出してもいいのですが、こっちのほうがスマートのような気がします。

//クライアントサイドにアラートを出す
RegisterClientScriptBlock(“client”, “<script language=’JavaScript’> alert(‘RegisterClientScriptBlock’) </script>”);

RegisterStartupScript(“client”, “<script language=’JavaScript’> alert(‘RegisterStartupScript’) </script>”);

「RegisterClientScriptBlock」で書き出すと、Formの開始タグの直後に出力されます。
「RegisterStartupScript」の場合はFormの終了タグの直前です。

書き出すタイミングが違うということは、クライアントサイドで実行されるタイミングも違う為、使い分けると色々と便利です。
サンプルではalertしか出してませんが、メソッドをaspxページに用意しておき必要なときにコールする等、用途は色々です。

Tags:

CSVファイルをダウンロードさせる方法

2006-02-03
このエントリーをはてなブックマークに追加

System.IO.MemoryStream ms = new System.IO.MemoryStream(System.Text.Encoding.GetEncoding(“Shift-JIS”).GetBytes(strBuffer));

Response.AddHeader(“Content-Disposition”,”attachment;filename=total.csv”);
Response.ContentType = “application/octet-stream”;
Response.BinaryWrite(ms.ToArray());
Response.End();

MemoryStreamが、実際のデータです。
「strBuffer(string型)」にダウンロードさせるCSVデータを突っ込んでおいて、それをMemoryStreamに乗せて吐き出すといったイメージですね。

別にサーバサイドでファイル生成して、それをダウンロードさせてもいいのですが、こっちの方がファイルIOもなく、ゴミも残らないのでスマートかと思われます。

Tags:

ASP.NETでJavaScriptのconfirmを表示し、処理を分岐させる方法

2006-02-01
このエントリーをはてなブックマークに追加

ポストバックでイベントを起こすASP.NETの場合、JavaScriptでconfirmを出して「確認」→「分岐」という流れを作る場合はどうしたらよいだろうと悩んで、調べてみました。

//Page_Loadで属性の追加をする
public void Page_Load(object sender, EventArgs e)
{
    Button1.Attributes[“onclick”]=”return confirm(‘クリックしたの?’);”;
}

//confirmでtrueが返ってきたらこのイベントが呼ばれる
private void Button1_Click(object sender, System.EventArgs e)
{
    RegisterStartupScript(“client”, “< script language=’JavaScript’> alert(‘クリックされちゃった’) < /script> “);
}

かなり割愛してますが、必要なコードはこんな程度です。
Page_LoadでButton1というコントロールに属性を追加しておくだけです。あとは勝手に分岐処理を記述してくれます。

aspx側のボタンコントロールにonclickを直接記述したらエラーが出てしまいました。まぁ、onclickはポストバックイベントが動的に記述されるので、当然といえば当然の結果か。
もっとスマートなやり方もありそうだけど、とりあえずこんな感じで。

Tags: