【发布时间】:2018-10-24 01:46:28
【问题描述】:
我已正确设置 Hangfire。我可以从邮递员运行以下代码:
[HttpPost("appointments/new")]
public async Task<IActionResult> SendMailMinutely()
{
RecurringJob.AddOrUpdate(() => Console.WriteLine("Recurring!") Cron.Minutely);
await Task.CompletedTask;
return Ok();
}
当我达到这个 API 点时,它工作正常。
我想做的是使用上面相同的代码运行我的电子邮件控制器。我修改的SchedulersController代码是:
[Route("/api/[controller]")]
public class SchedulersController : Controller
{
private readonly MailsController mail;
public SchedulersController(MailsController mail)
{
this.mail = mail;
}
[HttpPost("appointments/new")]
public async Task<IActionResult> SendMailMinutely()
{
RecurringJob.AddOrUpdate(() => mail.SendMail(), Cron.Minutely);
await Task.CompletedTask;
return Ok();
}
}
我的MailsController 是:
[HttpPost("appointments/new")]
public async Task<IActionResult> SendMail()
{
var message = new MimeMessage ();
message.From.Add (new MailboxAddress ("Test", "test@test.com"));
message.To.Add (new MailboxAddress ("Testing", "test@test123.com"));
message.Subject = "How you doin'?";
message.Body = new TextPart ("plain") {
Text = @"Hey Chandler,
I just wanted to let you know that Monica and I were going to go play some paintball, you in?
-- Joey"
};
using (var client = new SmtpClient ()) {
client.ServerCertificateValidationCallback = (s,c,h,e) => true;
client.Connect ("smtp.test.edu", 25, false);
await client.SendAsync (message);
client.Disconnect (true);
}
return Ok();
}
我收到的错误信息是:
执行请求时发生未处理的异常。 System.InvalidOperationException:尝试激活“Restore.API.Controllers.SchedulersController”时无法解析“Restore.API.Controllers.MailsController”类型的服务
如何使用我的MailsController 来安排电子邮件以使用 Hangfire 发送?
任何帮助将不胜感激。
【问题讨论】:
-
如果您只是要等待完成的任务,为什么要将您的方法标记为异步?为什么不直接返回
IActionResult而不是Task<IActionResult>? -
因为它必须是
async,因为我有多个请求。有些请求需要一些时间。此邮件请求不应等待其他请求完成。 -
为什么不把你的邮件发送逻辑封装到一个单独的服务中呢?为什么将其直接放在控制器的操作方法中?它不属于那里。
-
我看到你在 SchedulersController 中调用的唯一异步代码是
await Task.CompletedTask;。 -
我建议将 SendMail 中的逻辑移动到一个单独的类中,一个将被注入到两个控制器中的 EmailService。将一个控制器注入另一个控制器是一种反模式。同时,请参阅以下答案以了解如何解决您的问题。 stackoverflow.com/a/49372654/10296119