2017-05-04 33 views
0

我創建用於發送電子郵件一個Web API。有兩個端點停止執行基於布爾變量值

  1. /API/Sendmail的這應該開始發送電子郵件,現在工作的罰款。
  2. /API/StopMail這應該停止發送電子郵件,此方法不停止發送電子郵件。這是實際的問題。當我達到這個目標時,我應該怎麼做才能阻止電子郵件。

    public bool stop = false; 
    
        [HttpGet] 
        public void SendMail() 
        { 
         var emails = db.Emails.ToList();    
    
         foreach (var email in emails) 
         { 
          //code for sending mail here... 
    
          if (stop == true) 
           break; 
         } 
        } 
    
        [HttpGet] 
        public void StopMail() 
        { 
         stop = true; 
        } 
    
+0

你可以不喜歡這個停止定時器 - 控制器是爲每個請求一次性使用。 –

+0

您可以創建一個服務來發送郵件並創建該服務單例(使用單例模式或DI框架)。 –

+0

@ DanielA.White然後我應該採用什麼方法 –

回答

0

你真的不能這樣做與ASP.NET內置的東西有太多的考慮。控制器僅存在於一個請求的生命週期中。 ASP.NET不是爲後臺工作而設計的。

有一些第三方庫和一個內置的工具,可以幫助。 QueueBackgroundWorkItem看起來是最有前途的。

斯科特Hanselman有一個write up on different approaches

-1

你需要有東西,允許共享上下文。控制器默認會有自己的。

你可以使用像一個static包裝圍繞一個共同的背景下該使用方法:

public static class EmailSenderContext { 
    private static object _locker = new object(); 
    public static bool _canSend = true; 

    public static bool CanSend() { 
     var response = false; 
     lock(_locker) { 
      response = _canSend; 
     } 
     return response; 
    }  

    public static void ChangeSendState(bool canSend) { 
     lock(_locker) { 
      _canSend = canSend; 
     } 
    } 
} 
public class MyController { 
    [HttpGet] 
    public void SendMail() 
    { 
     var emails = db.Emails.ToList();    

     foreach (var email in emails) 
     { 
      //code for sending mail here... 

      if (!EmailSenderContext.CanSend()) 
       break; 
     } 
    } 

    [HttpGet] 
    public void StopMail() 
    { 
     EmailSenderContext.ChangeSendState(false); 
    } 

} 

你要知道,這隻會在一臺服務器上運行。當您希望這是一個全局標誌時,您需要引入一個數據庫來存儲該值,並且每次檢查時都需要訪問該數據庫值。

這是一個OVERLY簡化的例子,並與許多系統,將無法正常工作。如果這對於只能在單個服務器上運行並且沒有不同使用訪問權限的工作項目來說是一件小事情,那麼它將起作用。再一次,因爲這是一個共享的上下文,所有用戶都可以通用訪問該值。

+0

這一次只允許一個發件人。 –

+0

靜態類和字段在請求之間共享。 http://stackoverflow.com/a/195290/1251624 也許我誤解了,但鑑於這種情況和類本身'鎖',它不應該允許它在一個不同的時間點閱讀更新價值@ DanielA.White –

+0

我的意思是如果有兩件事情要求'sendmail'和'stopmail'同時上下文會感到困惑。 –

0

你會更好地執行另一個類來執行sendmail的操作,其中將包括停止標誌。您可以將該類作爲單例注入到控制器中,並支持您所描述的啓動/停止操作。

0

有2個解決方案你的問題。我的問題是爲什麼你需要一個Web API發送郵件的目的?

1解決方案

  1. 使用Windows服務這一點。
  2. 您可以隨時停止服務。(你甚至可以阻止網頁API服務)

第二個解決方案

  1. 使用單一的API接受布爾變量
  2. 使用定時器保持定時器變量的類
  3. 開始發送電子郵件時的計時器是必需的(而真正的api輸入)//在定時器處理程序中添加此代碼var emails = db.Emails.ToList();

    foreach(電子郵件中的電子郵件地址){//此處發送郵件的代碼... if(stop == true)break; }

  4. ,當你想停止發送電子郵件(而假的API輸入)