2010-08-12 98 views
0

我正在創建郵件發送方web服務。每10秒發送1封郵件。我的總郵件數爲1500.此操作在4.16小時後(1500 * 10/60/60)結束。在asp.net中運行web服務需要多長時間

我的Web服務的方法是這裏>>

[WebMethod] 
public string BroadcastMail(DataView dv, string title, string body,MailAddress FromAddress, string[] fileattachments) 
    { 
     SmtpClient client = new SmtpClient("smtp.mysite.com"); 
     client.EnableSsl = false; 
     client.UseDefaultCredentials = true; 
     client.Credentials = new NetworkCredential("*********", "********"); 

     foreach (DataRowView item in dv) 
     { 
      MailMessage msg = new MailMessage(); 
      msg.From = FromAddress; 
      msg.Subject = title; 
      msg.IsBodyHtml = true; 
      msg.BodyEncoding = Encoding.UTF8; 
      msg.Body = body.AsciiToUnicode(); 
      msg.To.Add(email); 
      client.Send(msg); 
      Thread.Sleep(10000);   
     } 
    } 

你想從我問。你爲什麼要等10秒。因爲我的郵件提供商同意郵件帳戶每隔1小時可能發送300封郵件。

我想從aspx頁面調用。

我的問題是:
如何從aspx頁面調用此服務?

此Web服務是否工作?

你有另外一個想法嗎?

回答

3

沒有理由實現這個作爲一個網絡回收問題服務,特別是因爲你有10秒的睡眠時間,可能會發生多次,可能會超時。此外,作爲asp.net下的一個長時間運行的進程,您將面臨應用程序池回收的風險,從而丟失尚未發送的郵件。

處理這個問題的一個更簡單/更好的方法是將電子郵件存儲到數據庫中,並從那裏處理它們,一旦電子郵件發送後從表中刪除記錄。如果您使用類似Windows服務(而不是 Web服務)或由Scheduled Task觸發的控制檯應用程序來執行發送每個單獨電子郵件的代碼,它也會更加健壯。

總結:

  • 使用休眠和發送多封電子郵件可能是非常不可靠的
  • 使用Windows服務或計劃任務

另外一個Web服務,您的代碼行msg.To.Add(email);但變量email沒有在任何地方聲明?

1

我認爲這裏最好的辦法是在BroadcastMail方法中產生一個單獨的線程,並讓該線程處理郵件 - 這種方式可以讓您的BroadcastMail方法及時返回,同時還能觸發廣播。

並非是一個ASP.Net程序員,不過,我準備在火焰被擊落,如果這種做法將打擊涉及的流程等

+0

由於應用程序池回收以及在OP代碼中沒有「可靠性」檢查以減輕此問題的事實,電子郵件被丟失*的風險很大 – Rob 2010-08-12 06:01:05

-1

此外,你通過一個名爲「dv」的集合迭代,你永遠不會使用它,這是爲什麼?

0

Service.cs

using System; using System.Collections.Generic;