2010-08-12 100 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;

相关问题