【发布时间】:2014-09-25 10:11:10
【问题描述】:
我有一个通过命名管道工作的 WCF 服务,它从 ASP.NET MVC 应用程序接收数据:
[ServiceContract]
public interface IEmailProcessor
{
[OperationContract(AsyncPattern = true)]
void SendEmails(string subject, string body, string from, string to);
}
服务获取电子邮件的主题、正文、发件人和收件人。然后它会将电子邮件放在一起并通过 SMTP 发送。
客户端(MVC 应用程序)一次发送几封电子邮件,所以我希望服务本身异步工作(客户端只需调用 SendEmails 方法几次,然后 WCF 服务器负责其余的工作)。但是我的电子邮件服务器有时会因为新电子邮件地址的灰名单而拒绝发送电子邮件。这就是为什么我希望 WCF 服务器也将这些电子邮件排队并尝试将它们一一发送(如果发生错误,请重试几次)。
我已经阅读了几个关于 WCF 异步和 MSMQ 方法的主题,但是在我的情况下,最好的方法是什么?我应该创建两个 WCF 服务(客户端-服务器和服务器-服务器)吗?或者也许使用多线程?不使用任何内置 SMTP 解决方案对我来说也很重要,因为我想扩展我的服务以处理其他消息,而不仅仅是电子邮件。
【问题讨论】:
-
这在很大程度上取决于您的要求。我不会更改合同(因为您的帖子中不需要确认)所以这已经足够了。您只需要在服务内部构建一个队列(例如使用 ConcurrentQueue 集合),然后处理该队列并将未成功传递的电子邮件重新排队。如果您使用的是 .net 4/4.5,我还建议将排队的电子邮件封装到 Task.Run() 中。此外,根据数量,您可以考虑将服务设为单例。
标签: c# asp.net asp.net-mvc wcf email