2017-02-18 5 views
0

私は電子メールを送信し、私のajaxスクリプトに "成功" json応答を返すコントローラーを持っています。コントローラーから電子メールを送信すると遅れます

コントローラは次のようになります。

[HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult EmailSend(string input1) 
    { 

     EmailSignup person = new EmailSignup { emailhasbeensent = false, Email = input1 }; 

     try 
     { 
      SmtpClient client = new SmtpClient("smtp.gmail.com", 587); 
      client.EnableSsl = true; 
      client.UseDefaultCredentials = false; 
      client.DeliveryMethod = SmtpDeliveryMethod.Network; 
      client.Credentials = new NetworkCredential("Email", "PW"); 

      MailMessage message = new MailMessage(); 
      message.From = new MailAddress("Email"); 
      message.To.Add(person.Email); 
      message.Subject = "Thank you for subscribing"; 
      message.Body = "You have now subscribed for our newsletter"; 
      message.IsBodyHtml = true; 
      client.Send(message); 
      person.emailhasbeensent = true; 
      return Json(new { status = "success" }); 
     } 

     catch (Exception ex) 
     { 
      return Json(new { status = "error" }); 
     } 
    } 

は、残念ながらそれが受け取る前にメールが「アイドル」のようなものを入力されているページいることを意味成功応答が送信される前に遅延があります成功応答。

応答がすぐに送信されるように、このプロセスを高速化する方法はありますか? そうでなければ、ローディングバーを実装して、何か「舞台裏で」起こっていることをユーザーに示すことができますか?

答えて

0

理想的には、プロセスをUIスレッドから外してこの作業を他のプロセスにオフロードすることを検討するのが理想的です。たとえば、この情報(電子メールに必要な最小限の情報、ケース内のtoAddress)を他のプロセスが読み込んで電子メールを送信するキューに送信することができます。トランスナショナルキューを適切に使用することで、フォールトトレランスも保証されます。

もう1つの解決策は、この作業をThreadPoolの別のスレッドに渡して、UIスレッドがコードの実行が完了するまで待つ必要がないようにすることです。他のスレッドが操作を正常に完了できない場合は、追跡するのは難しいです!

private void SendEmail(string emailAddress) 
{ 
    // Your existing code to send email goes here 
    // Make sure you handle(LOG) exceptions 

} 

[HttpPost] 
public ActionResult EmailSend(string input1) 
{ 
    try 
    { 
     // Have another thread executes the SendEmail method 
     Task.Run(() => { SendEmail(input1); }); 
     return Json(new { status = "success" }); 
    } 
    catch (Exception ex) 
    { 
     //to do : LOG exceptions 
     return Json(new { status = "error" }); 
    } 
} 

これをすべて実行したくない場合は、クライアント側で「読み込み中」というメッセージを表示して何かが起こっていることを知ることができます。以下のサンプルでは、​​ボタンのテキストを「お待ちください...」に変更しています。ボタンを無効にして、ajax呼び出しから応答が返されるまでユーザーが再度クリックしないようにします。

$(function() { 
    $("#emailSignup").click(function (e) { 
     e.preventDefault(); 
     var _this = $(this); 
     _this.text("Please wait...").attr("disabled", "disabled"); 

     $.ajax({ 
      type: 'POST', 
      url: "@Url.Action("EmailSend", "Home")", 
      data: { input1: "Some value" }, 
     }).done(function (res) { 
      if (res.status === "success") { 
       $("#MailFoot").hide(); 
       $("#ty").show(); 
      } 
      else { 
       _this.text("Please wait...").removeAttr("disabled"); 
       alert("Error sending email"); 
      } 
     }); 
    }); 
}) 

ボタンのテキストを単に更新するのではなく、何でもできます。多分プログレスバーを表示していますか?スピナー?あなたのページにスピナーイメージを保存し(最初は隠れています)、ajaxコールの開始/終了時に必要に応じて表示/非表示/

+0

ありがとうございました!基本的に、もし私がSendemailコードを別のメソッドに移すと、私のコードは一度生きていれば失敗しにくくなりますか?私はそれを理解するので、私はこれを行うことによってボトルネックを防ぎますか? –

関連する問題