非同期コントローラ使ってみた - まめしば雑記
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