工作流程需要执行冗长的ASP.净的任务
本文关键字:ASP 任务 执行 工作流程 | 更新日期: 2023-09-27 18:07:53
我有一个ASP。NET WebForms应用程序,它模仿了帮助台系统。这个应用程序运行得很好,但是最近,他们要求我修改它,以便在打开一个新的帮助台票证时,它可以向系统中的每个人发短信。
我用Twilio来做这件事,它工作得很好。唯一的问题是,系统中应该有15个人收到这条短信,当提交门票时,申请需要大约15-20秒的时间从提交重新发布。在未来,可能会有超过15人,甚至翻倍。
我想知道的是,是否有一种方法可以在后台发送这些消息,以便页面立即从提交中返回。以下是我的相关代码:
这是我写的发送短信的主要方法。它在一个Utility类中:
public static string SendSms(string phoneNumber, string message)
{
var request = (HttpWebRequest)WebRequest.Create("https://api.twilio.com/2010-04-01/Accounts/" + Constants.TwilioId + "/Messages.json");
string postData = "From=" + Constants.TwilioFromNumber + "&To=+1" + phoneNumber + "&Body=" + HttpUtility.HtmlEncode(message);
byte[] data = Encoding.ASCII.GetBytes(postData);
string authorization = string.Format("{0}:{1}", Constants.TwilioId, Constants.TwilioAuthToken);
string encodedAuthorization = Convert.ToBase64String(Encoding.ASCII.GetBytes(authorization));
string credentials = string.Format("{0} {1}", "Basic", encodedAuthorization);
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = data.Length;
request.Headers[HttpRequestHeader.Authorization] = credentials;
using (var stream = request.GetRequestStream())
{
stream.Write(data, 0, data.Length);
}
string responseString;
using (var response = (HttpWebResponse) request.GetResponse())
{
using (var reader = new StreamReader(response.GetResponseStream()))
{
responseString = reader.ReadToEnd();
}
}
return responseString;
}
我是这样称呼它的:
public void BtnSubmit_Click(object sender, EventArgs e)
{
//
// This is more code here, but its irrelevant
//
var employees = new Employees();
employees.GetAll();
foreach (Employee employee in employees)
{
string number = employee.CellPhoneAreaCode + employee.CellPhonePrefix +
employee.CellPhoneSuffix;
if (!string.IsNullOrEmpty(number) && number.Length == 10)
{
Utility.SendSms(number, "A new Help Desk Ticket is in the System!");
}
}
}
我唯一能想到的另一个想法是创建一个WCF服务,但这似乎有点小题大做。欢迎提出任何建议!
任何异步方法都可以达到这个目的。例如,使用Task
或(如果您使用的是。net 4.5+) async
方法。(请记住,通过提供类似.ContinueWith()
的回调来处理异步错误,以检查任务的错误并相应地响应。)
为此,我建议将消息本身持久化到应用程序的一个简单数据库表中,并根据需要继续使用UI。然后有一个单独的应用程序,比如Windows服务,它定期轮询数据库表,并在记录的简单循环中发送消息。
对于这种情况,一个很好的方法是在消息记录上保留一个简单的状态标志。排队、发送、错误(带有错误消息)等。Windows服务可以在循环中发送消息时更新记录。如果出现任何给定的消息错误,只需更新该记录并继续循环。