2013-10-11 2 views
0

Я разрабатываю приложение ASP.NET (с SQL-сервером). Мое требование - отправлять электронные письма с веб-сервера хоста (в моем случае Windows Shared Hosting из Godaddy) через определенные промежутки времени - это могут быть ежедневно или еженедельно или ежемесячно. Невозможно использовать вкладку Cron, потому что это команда Linux, которая работает на хостинге Linux. Годовой хостинг Godaddy не имеет инструментария планировщика заданий. Я много раз пробовал, но не мог добиться успеха. Я уже использовал эти три кода.Планирование заданий в ASP.NET (автоматическая отправка электронной почты)

Первая попытка:

<%@ Application Language="C#" %> 
<%@ Import Namespace="System.IO" %> 
<%@ Import Namespace="System.Threading" %> 
<%@ Import Namespace="System.Data" %> 
<%@ Import Namespace="System.Data.SqlClient" %> 
<%@ Import Namespace="System.Timers" %> 
<script runat="server">  

    void Application_Start(object sender, EventArgs e) 
    { 
     // Code that runs on application startup 
     Thread timerThread = new Thread(TimerForNotification); 
     timerThread.IsBackground = true; 
     timerThread.Priority = ThreadPriority.Highest; 
     timerThread.Start();  
    } 

    void TimerForNotification() 
    { 
     //Code that runs on application startup 
     System.Timers.Timer timScheduledTask = new System.Timers.Timer(); 
     timScheduledTask.Interval = 1000 * 60 * 60; //TimeSpan.FromMinutes(30).Minutes * 1000 * 60; 
     timScheduledTask.Enabled = true; 
     timScheduledTask.Elapsed += new System.Timers.ElapsedEventHandler(timScheduledTas_Elapsed);  
    } 

    void timScheduledTas_Elapsed(object sender, System.Timers.ElapsedEventArgs e) 
    { 
     ConnectionStringSettings conn = ConfigurationManager.ConnectionStrings["myshop_con"]; 
     SqlConnection con = new SqlConnection(conn.ConnectionString); 
     SqlCommand cmd = con.CreateCommand(); 
     cmd.CommandType = CommandType.Text; 
     cmd.CommandText = "insert into dbo.tblUserDetail(UName)VALUES('" + DateTime.Now.ToString() + "')"; 
     con.Open(); 
     cmd.ExecuteNonQuery(); 
     con.Close(); 
    }  

</script> 

Вторая попытка:

<%@ Application Language="C#" %> 
<%@ Import Namespace="System.IO" %> 
<%@ Import Namespace="System.Threading" %> 
<%@ Import Namespace="System.Data" %> 
<%@ Import Namespace="System.Data.SqlClient" %> 


<script runat="server">  

    public class TimerStarter 
    { 
     private static System.Threading.Timer threadingTimer; 
     public static void StartTimer() 
     { 
      if (null == threadingTimer) 
      { 
       threadingTimer = new System.Threading.Timer(new TimerCallback(DoActions), HttpContext.Current, 0, 3600000); 
      } 
     } 
     private static void DoActions(object sender) 
     { 
      ConnectionStringSettings conn = ConfigurationManager.ConnectionStrings["myshop_con"]; 
      SqlConnection con = new SqlConnection(conn.ConnectionString); 
      SqlCommand cmd = con.CreateCommand(); 
      cmd.CommandType = CommandType.Text; 
      cmd.CommandText = "insert into dbo.tblUserDetail(UName)VALUES('" + DateTime.Now.ToString() + "')"; 
      con.Open(); 
      cmd.ExecuteNonQuery(); 
      con.Close(); 
     } 

    } 


    void Application_Start(object sender, EventArgs e) 
    { 
     TimerStarter.StartTimer(); 
    } 
</script> 

Третья попытка:

<%@ Application Language="C#" %> 
<%@ Import Namespace="System.IO" %> 
<%@ Import Namespace="System.Threading" %> 
<%@ Import Namespace="System.Data" %> 
<%@ Import Namespace="System.Data.SqlClient" %> 


<script runat="server">  
    private void NightlyProcess(object o) 
    { 
     ConnectionStringSettings conn = ConfigurationManager.ConnectionStrings["myshop_con"]; 
     SqlConnection con = new SqlConnection(conn.ConnectionString); 
     SqlCommand cmd = con.CreateCommand(); 
     cmd.CommandType = CommandType.Text; 
     cmd.CommandText = "insert into dbo.tblUserDetail(UName)VALUES('" + DateTime.Now.ToString() + "')"; 
     con.Open(); 
     cmd.ExecuteNonQuery(); 
     con.Close(); 
    } 


    void Application_Start(object sender, EventArgs e) 
    { 
     System.Threading.TimerCallback tcb = new System.Threading.TimerCallback(NightlyProcess); 
     System.Threading.Timer theTimer = new System.Threading.Timer(tcb, null, GetTimerInitialDelay(20, 40), GetTimerRepeatDelay(24));   
    } 

    private long GetTimerInitialDelay(int hours, int minutes) 
    { 
     long startMS, repeatMS, currentMS; 
     startMS = (1000 * 60 * 60 * hours) + (1000 * 60 * minutes); 
     repeatMS = GetTimerRepeatDelay(24); 

     DateTime now = DateTime.Now; 
     long currentHours = 1000 * 60 * 60 * now.Hour; 
     long currentMinutes = 1000 * 60 * now.Minute; 
     long currentSeconds = 1000 * now.Second; 
     long currentMilliSeconds = now.Millisecond; 
     currentMS = currentHours + currentMinutes + currentSeconds + currentMilliSeconds; 
     long delay = startMS - currentMS; 
     if (delay < 0) 
     { 
      return repeatMS + delay; 
     } 
     else 
     { 
      return delay; 
     } 
    } 

    private long GetTimerRepeatDelay(int hours) 
    { 
     long repeatMS; 
     repeatMS = 1000 * 60 * 60 * hours; 
     return repeatMS; 
    } 
</script> 

Как я мог бы получить эти письма, отправленные в эти интервалы?

ответ

0

То, чего вы пытаетесь достичь, невозможно без какого-либо планировщика задач или службы Windows, работающей в фоновом режиме.

Что вы можете попытаться сделать, так это создать веб-страницу, которая по запросу отправит определенное количество писем, а затем вызовет эту страницу, используя некоторую стороннюю службу ping или очень простой скрипт, запущенный с вашего локального ПК.

Обратите внимание, что это только обходное решение, и для надежного решения требуется больше доступа на сервере с VPS или выделенным сервером.

Еще одна вещь, которую вы можете попробовать - это услуга третьей стороны, которая будет отправлять вам электронные письма. Вы можете попробовать почтовый шимпанзе - у них есть бесплатная версия с ограниченным количеством писем в месяц, а также есть API, который вы можете использовать.

0

Очень старый вопрос, но может помочь некоторым новым читателям. В ASP.NET мы можем имитировать службу Windows для запуска запланированных заданий.

Очень странно, но элементы кеша очень полезны для этой цели.

Логика очень проста и отличается.

  1. Создать объект кэша

    private const string DummyCacheItemKey = "GagaGuguGigi"; 
    
    protected void Application_Start(Object sender, EventArgs e) 
    { 
        RegisterCacheEntry(); 
    } 
    
    private bool RegisterCacheEntry() 
    { 
        if(null != HttpContext.Current.Cache[ DummyCacheItemKey ]) 
         return false; 
    
        HttpContext.Current.Cache.Add(DummyCacheItemKey, "Test", null, 
        DateTime.MaxValue, TimeSpan.FromMinutes(1), 
        CacheItemPriority.Normal, 
        new CacheItemRemovedCallback(CacheItemRemovedCallback)); 
    
        return true; 
    } 
    
  2. Когда объект кэша был удален, поднять функцию обратного вызова для запуска ваших запланированных заданий.

    public void CacheItemRemovedCallback(string key, 
               object value, CacheItemRemovedReason reason) 
    { 
        Debug.WriteLine("Cache item callback: " + DateTime.Now.ToString()); 
        HitPage() 
    // Do the service works 
    
    DoWork(); 
    } 
    
  3. В функции обратного вызова вам необходимо снова настроить кеш. Для этого создайте фиктивную страницу и посетите веб-клиент.

    private const string DummyPageUrl = 
          "http://localhost/TestCacheTimeout/WebForm1.aspx"; 
    
    private void HitPage() 
    { 
        WebClient client = new WebClient(); 
        client.DownloadData(DummyPageUrl); 
    } 
    
  4. На Application_BeginRequest проверить, является ли это фиктивная страница или нет.

    protected void Application_BeginRequest(Object sender, EventArgs e) 
    { 
        // If the dummy page is hit, then it means we want to add another item 
    
        // in cache 
    
        if(HttpContext.Current.Request.Url.ToString() == DummyPageUrl) 
        { 
         // Add the item in cache and when succesful, do the work. 
    
         RegisterCacheEntry(); 
        } 
    } 
    

Here is the details how you can schedule your activities with pure ASP.NET

 Смежные вопросы

  • Нет связанных вопросов^_^