ASP.NET Core 2 EmailSender исключение с Sendgrid - PullRequest
0 голосов
/ 19 мая 2018

Я пытаюсь реализовать SendGrid в Шаблон углового проекта с ASP.NET Core .

Я использую этот пример: Подтверждение учетной записи и восстановление пароля в ASP.NET Core

К сожалению, я всегда получаю эту ошибку (статус: 500):

System.InvalidOperationException: не удается разрешить службу для типа «MyWebApp.Extensions.EmailSender», покапытается активировать 'MyWebApp.Controllers.AuthenticationController'

Вот контроллер:

[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");
}

И EmailSender:

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.

1 Ответ

0 голосов
/ 19 мая 2018

Убедитесь, что служба и ее абстракция зарегистрированы в наборе служб, чтобы поставщик услуг знал, как их разрешить

Startup.ConfigureServices

services.AddSingleton<IEmailSender, EmailSender>();

services.Configure<AuthMessageSenderOptions>(Configuration);
...