工作流程需要执行冗长的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服务,但这似乎有点小题大做。欢迎提出任何建议!

工作流程需要执行冗长的ASP.净的任务

任何异步方法都可以达到这个目的。例如,使用Task或(如果您使用的是。net 4.5+) async方法。(请记住,通过提供类似.ContinueWith()的回调来处理异步错误,以检查任务的错误并相应地响应。)

但是,在这种情况下,要有意义地响应错误可能很复杂。这听起来像是在发生失败时希望不断重试的操作(在不断失败的情况下使用日志记录),并且即使一条消息失败,也肯定希望继续循环。所以一些更手动的东西可能是合适的。

为此,我建议将消息本身持久化到应用程序的一个简单数据库表中,并根据需要继续使用UI。然后有一个单独的应用程序,比如Windows服务,它定期轮询数据库表,并在记录的简单循环中发送消息。

对于这种情况,一个很好的方法是在消息记录上保留一个简单的状态标志。排队、发送、错误(带有错误消息)等。Windows服务可以在循环中发送消息时更新记录。如果出现任何给定的消息错误,只需更新该记录并继续循环。