【问题标题】:ASP.NET Core 2 EmailSender exception with Sendgrid带有 Sendgrid 的 ASP.NET Core 2 EmailSender 异常
【发布时间】:2018-05-19 09:50:11
【问题描述】:

我正在尝试在Angular project template with ASP.NET Core 中实现 SendGrid。

我正在使用这个例子:Account confirmation and password recovery in ASP.NET Core

不幸的是,我总是收到此错误(状态:500):

System.InvalidOperationException:尝试激活“MyWebApp.Controllers.AuthenticationController”时无法解析“MyWebApp.Extensions.EmailSender”类型的服务

这里是控制器:

[HttpPost]
public async Task<IActionResult> Register([FromBody]RegistrationViewModel model)
{
    if (!ModelState.IsValid)
    {
        return BadRequest(ModelState);
    }

    var userIdentity = _mapper.Map<AppUser>(model);
    var result = await _userManager.CreateAsync(userIdentity, model.Password);

    if (!result.Succeeded)
        return new BadRequestObjectResult(Errors.AddErrorsToModelState(result, ModelState));

    //Enable account confirmation
    var code = await _userManager.GenerateEmailConfirmationTokenAsync(userIdentity);
    var callbackUrl = Url.EmailConfirmationLink(userIdentity.Id, code, Request.Scheme);
    await _emailSender.SendEmailConfirmationAsync(model.Email, callbackUrl);

    //await _appDbContext.SaveChangesAsync();

    return new OkObjectResult("Account created");
}

还有电子邮件发件人:

public class EmailSender : IEmailSender
{
    public EmailSender(IOptions<AuthMessageSenderOptions> optionsAccessor)
    {
        Options = optionsAccessor.Value;
    }

    public AuthMessageSenderOptions Options { get; } //set only via Secret Manager

    public Task SendEmailAsync(string email, string subject, string message)
    {
        return Execute(Options.SendGridKey, subject, message, email);
    }

    public Task Execute(string apiKey, string subject, string message, string email)
    {
        var client = new SendGridClient(apiKey);
        var msg = new SendGridMessage()
        {
            From = new EmailAddress(<email-address>, <name>),
            Subject = subject,
            PlainTextContent = message,
            HtmlContent = message
        };
        msg.AddTo(new EmailAddress(email));
        return client.SendEmailAsync(msg);
    }
}

我尝试直接在代码中编写apiKey,但结果相同。 我已经在数据库中成功添加了一个用户,但是没有 SendGrid。

【问题讨论】:

    标签: c# asp.net-core asp.net-core-2.0 sendgrid


    【解决方案1】:

    确保服务及其抽象在服务集合中注册,以便服务提供者知道如何解决它们

    Startup.ConfigureServices

    services.AddSingleton<IEmailSender, EmailSender>();
    
    services.Configure<AuthMessageSenderOptions>(Configuration);
    

    【讨论】:

    • 他们已经注册了。我忘了在问题中显示它。顺序重要吗?它们是在services.AddMvc() 之后添加的
    • @GSeriousB 如果您查看问题中链接到的文档,您将看到他们在哪里注册。
    • 我在最后移动了代码,但同样的错误。可能问题出在其他地方。我会找出来的。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-23
    • 2018-11-14
    • 2017-10-26
    • 2019-01-25
    • 2018-06-02
    • 2019-05-15
    相关资源
    最近更新 更多