非同期コントローラ使ってみた - まめしば雑記
http://d.hatena.ne.jp/shiba-yan/20100715/1279204349
上記のブログで非同期コントローラーが面白そうだったので、前回の ASP.NET MVC で複数ファイルのアップロード を少し修正して試してみました(※ASPX部分は そのまま使用しています)。
基本的には、基本クラス(Controller → AsyncController) とアクション名(Index → IndexAsync) を変えて、完了時のメゾット(IndexCompleted) を定義しているだけですが、アップロードされたファイルをそのまま保存しては、非同期にする意味がほとんどないので、保存後にメールでファイルを送る処理を追加しています。
[HandleError]
public class HomeController : AsyncController
{
[HttpPost]
public ActionResult IndexAsync(HttpPostedFileBase[] fileUpload)
{
foreach (var f in fileUpload)
{
AsyncManager.OutstandingOperations.Increment();
Thread t = new Thread(new ParameterizedThreadStart(Upload));
t.Start(f);
}
return View();
}
private void Upload(object o)
{
HttpPostedFileBase f = (HttpPostedFileBase)o;
if (f != null)
{
string filePath = Path.Combine(
HttpContext.Server.MapPath("~/App_Data/Uploaded/"),
Path.GetFileName(f.FileName));
f.SaveAs(filePath);
MyMail.Send(filePath);
}
AsyncManager.OutstandingOperations.Decrement();
}
public ActionResult IndexCompleted()
{
ViewData["msg"] = "アップロードが完了しました。";
return View();
}
public ActionResult About()
{
return View();
}
}
メールを送ってる部分は、こんな感じです。
public class MyMail
{
public static void Send(string fineName)
{
string from = "差出人メールアドレス";
string to = "送信先メールアドレス";
using (System.Net.Mail.MailMessage msg = new System.Net.Mail.MailMessage(from, to))
{
//添付ファイル
System.Net.Mail.Attachment attachment;
attachment = new System.Net.Mail.Attachment(fineName);
attachment.ContentType = new System.Net.Mime.ContentType("image/jpeg");
msg.Attachments.Add(attachment);
System.Net.Mail.SmtpClient sc = new System.Net.Mail.SmtpClient();
sc.Host = "メールサーバ";
sc.Send(msg);
}
}
}
参考
非同期コントローラ使ってみた - まめしば雑記
http://d.hatena.ne.jp/shiba-yan/20100715/1279204349
ASP.NET MVC での非同期コントローラーの使用 - MSDN
http://msdn.microsoft.com/ja-jp/library/ee728598.aspx