J'essaie de trouver une solution à une action d'envoi d'e-mail qui peut prendre beaucoup de temps et de temps sur notre équilibreur de charge qui se trouve sur Rackspace. La seule question que je pouvais trouver qui se rapporte à cette question spécifique est la suivante:Arrêtez l'action qui retarde l'équilibreur de charge
keep load balancer from timing out during long operation
Si je comprends bien que je dois exécuter une autre action tandis que la principale action lente est terminé au sondage en permanence et de retour afin de garder choses en vie. Mon action email contient les éléments suivants:
var sendto = db.Users
.Where(b => b.Id == model.SentTo |
((model.SelectedRoles.Any(s => b.Roles.Select(h => h.RoleId).Contains(s)))
&& ((b.enrollment.Any(h => h.cohort.CourseID == model.CourseID) | model.CourseID == null))
&& (b.OrgID == model.OrgID | model.OrgID == null))).ToList();
foreach (var address in sendto)
{
string Body = "message goes here";
EmailConfig.SendMessageViaMailGun(filestoattach, address.Email, null, email.Subject, Body);
}
Ainsi, une liste est créée puis boucle à travers les courriels envoyés à chaque personne sur la liste. La réponse de la méthode asynchrone dans la question ci-dessus semble faire l'affaire mais dans les commentaires je peux voir que c'est une mauvaise idée. Il est également obsolète en ce qui concerne la façon dont async fonctionne dans la dernière version de MVC.
Ma question est quelle est la meilleure façon de garder cette action de temporiser sur l'équilibreur de charge pendant qu'il se termine?
Vous devez déplacer cette logique en dehors du serveur Web. Fondamentalement, votre serveur Web doit mettre en file d'attente une demande (par exemple, à RabbitMQ), puis un service distinct fonctionnant ailleurs devrait la supprimer et envoyer les courriels. – mjwills