es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo crear una devolución de llamada por correo electrónico de confirmación desde la clase del repositorio en ASP.NET Core 3.1

Quiero crear un enlace de confirmación de correo electrónico desde la clase de repositorio de la API web de ASP.NET Core. Esto es fácil de hacer en el controlador de la API, pero tengo problemas para hacerlo desde la clase de repositorio. Sigo recibiendo este error:

No se pudo encontrar un IRouter asociado con ActionContext. Si su aplicación está utilizando enrutamiento de punto de conexión, puede obtener un IUrlHelperFactory a través de la inyección de dependencias y usarlo para crear un UrlHelper, o utilizar Microsoft.AspNetCore.Routing.LinkGenerator.

Esto es lo que tengo hasta ahora:

Este es mi código de repositorio para el registro:

“`c#
public async Task<(bool IsSuccess, string ErrorMessage)> Register(RegisterDTO model)
{
if (model != null)
{
var user = _mapper.Map<applicationuser>(model);
var result = await _userManager.CreateAsync(user, model.Password);
if (result.Succeeded)
{
await _userManager.AddToRoleAsync(user, "Admin");
var code = await _userManager.GenerateEmailConfirmationTokenAsync(user);
string _scheme = _urlHelper.ActionContext.HttpContext.Request.Scheme;
var callbackurl = _urlHelper.Action("ConfirmEmail",nameof(AccountController), new { email = user.Email, code = code }, _scheme);
var mailresult = _mailSender.SendEmail(model.Email, "Por favor confirme su cuenta haciendo clic aquí: <a href="\""" +="" callbackurl="" +="" "\"="">enlace</a>");
return (true, "Cuenta creada correctamente");
}
return (false, "Ocurrió un error al crear su cuenta");
}
return (false, "Por favor proporcione los datos del usuario");
}

“`
El Controlador de Cuentas

csharp
[HttpGet("{token}/{email}")]
public async Task<iactionresult> ConfirmEmail(string token, string email)
{
var result = await _repository.ConfirmEmail(token, email);
if (result.IsSuccess)
return Ok(result.ErrorMessage);
else
return BadRequest(result.ErrorMessage);
}

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para crear un enlace de confirmación de correo electrónico desde la clase de repositorio en ASP.NET Core Web API, necesitas utilizar la interfaz IUrlHelper. Sin embargo, el mensaje de error que estás recibiendo indica que el ActionContext asociado al endpoint no tiene un IRouter, lo que hace imposible usar directamente el IUrlHelper desde la clase de repositorio.

    Para solucionar este problema, puedes pasar una instancia de IUrlHelper a la clase de repositorio a través de la inyección de dependencias. Aquí tienes una versión actualizada del código que utiliza este enfoque:

    “`c#
    public class UserRepository : IUserRepository
    {
    private readonly UserManager _userManager;
    private readonly IMapper _mapper;
    private readonly IMailSender _mailSender;
    private readonly IUrlHelper _urlHelper;

    public UserRepository(UserManager<applicationuser> userManager, IMapper mapper, 
                      IMailSender mailSender, IUrlHelper urlHelper)
    {
        _userManager = userManager;
        _mapper = mapper;
        _mailSender = mailSender;
        _urlHelper = urlHelper;
    }
    
    public async Task<(bool IsSuccess, string ErrorMessage)> Register(RegisterDTO model)
    {
        if (model != null)
        {
            var user = _mapper.Map<applicationuser>(model);
            var result = await _userManager.CreateAsync(user, model.Password);
            if (result.Succeeded)
            {
                await _userManager.AddToRoleAsync(user, "Admin");
                var code = await _userManager.GenerateEmailConfirmationTokenAsync(user);
                var callbackurl = _urlHelper.Action("ConfirmEmail", "Account",
                    new { email = user.Email, code },
                    _urlHelper.ActionContext.HttpContext.Request.Scheme);
                var mailresult = _mailSender.SendEmail(model.Email,
                    "Por favor, confirma tu cuenta haciendo clic aquí: <a href="\""" +="" callbackurl="" +="" "\"="">enlace</a>");
                return (true, "Cuenta creada exitosamente");
            }
    
            return (false, "Ocurrió un error al crear tu cuenta");
        }
    
        return (false, "Por favor, proporciona los datos de usuario");
    }
    

    }
    “`

    Ten en cuenta que en el constructor estamos inyectando una instancia de IUrlHelper utilizando el contenedor de inyección de dependencias incorporado. Luego, podemos utilizar esta instancia para construir el enlace de confirmación dentro de la clase de repositorio.

    Además, en el código para registrar un usuario, pasamos el esquema actual de la solicitud HTTP al método IUrlHelper.Action() para asegurarnos de que el enlace construido utilice el protocolo correcto (http/https).

    Finalmente, el método de acción ConfirmEmail() en el controlador AccountController sigue siendo el mismo.

Comments are closed.