2

Это проект Asp.Net WEB Api. Я пытаюсь заставить пользователей зарегистрироваться на сайте и отправить электронное письмо пользователям, чтобы подтвердить их электронную почту перед тем, как предоставить доступ. Я могу зарегистрировать и сгенерировать токен для подтверждения электронной почты, но генерация URL-адреса обратного вызова не удалась. Вот мой код до сих пор.ASP.NET Web API 2 - Регистрация пользователя Подтверждение подтверждения электронной почты

AccountController.cs

[AllowAnonymous] 
[Route("Register")] 
public async Task<IHttpActionResult> Register(UserModel userModel) 
{ 
    if (!ModelState.IsValid) 
     { 
      return BadRequest(ModelState); 
     } 

    IdentityResult result = await authRepository.RegisterUser(userModel); 
     IHttpActionResult errorResult = GetErrorResult(result); 

    if (errorResult != null) 
     { 
      return errorResult; 
    } 


      return Ok(); 
} 

AuthRepository.cs

public async Task<IdentityResult> RegisterUser(UserModel userModel) 
{ 
    IdentityUser user = new IdentityUser 
     { 
      UserName = userModel.UserName, 
       Email = userModel.UserName 
    }; 

    IdentityResult result = await userManager.CreateAsync(user, userModel.Password); //var result 

     if (result.Succeeded) 
     { 
      try 
       { 
        var provider = new DpapiDataProtectionProvider("TestWebAPI"); 
        userManager.UserTokenProvider = new DataProtectorTokenProvider<IdentityUser>(provider.Create("EmailConfirmation")); 
        var code = await userManager.GenerateEmailConfirmationTokenAsync(user.Id); 
        UrlHelper urlHelper = new UrlHelper(); 
        var callbackUrl = urlHelper.Action 
         (
          "ConfirmEmail", "Account", 
          new { userId = user.Id, code = code }, 
          protocol: "http" 
         ); 

        await userManager.SendEmailAsync(user.Id, "Confirm your account", "Please confirm...." + "<a href=\"" + callbackUrl + "\">click here</a>"); 
     } 
       catch (Exception ex) 
       { 
        throw new Exception(ex.ToString()); 
       } 
    } 
     return result; 
} 

Он терпит неудачу в точке, где я генерировать CallBackURL. Я получаю это исключение: "Значение не может быть пустым \ г \ nParameter имя: RouteCollection"

трассировки стека

at System.Web.Mvc.UrlHelper.GenerateUrl(String routeName, String actionName, String controllerName, RouteValueDictionary routeValues, RouteCollection routeCollection, RequestContext requestContext, Boolean includeImplicitMvcValues) 
    at System.Web.Mvc.UrlHelper.GenerateUrl(String routeName, String actionName, String controllerName, String protocol, String hostName, String fragment, RouteValueDictionary routeValues, RouteCollection routeCollection, RequestContext requestContext, Boolean includeImplicitMvcValues) 
    at System.Web.Mvc.UrlHelper.Action(String actionName, String controllerName, Object routeValues, String protocol) 
    at TestWebAPI.AuthRepository.<RegisterUser>d__1.MoveNext() in d:\Workspace\VKalpa 2.0\Projects\Test\WebAPI-0.2\TestWebAPI\TestWebAPI\AuthRepository.cs:line 44 

Может кто-то пожалуйста, помогите?

ответ

2

И наконец, он работает. Я прочитал документацию и получил ее работу ... Вот мой код для тех, кто сталкивается с проблемами, отправляющими электронные письма в контексте Asp.Net Web API. Примеры SO, которые касаются аналогичных проблем в контексте веб-приложения MVC 5, также были полезными.

... 
if (result.Succeeded) 
      { 
       try 
       { 
        var provider = new DpapiDataProtectionProvider("TestWebAPI"); 
        userManager.UserTokenProvider = new DataProtectorTokenProvider<IdentityUser>(provider.Create("EmailConfirmation")); 
        var code = await userManager.GenerateEmailConfirmationTokenAsync(user.Id); 

        var newRouteValues = new RouteValueDictionary(new { userId = user.Id, code = code}); 
        newRouteValues.Add("httproute", true); 
        UrlHelper urlHelper = new System.Web.Mvc.UrlHelper(HttpContext.Current.Request.RequestContext, RouteTable.Routes); 
        string callbackUrl = urlHelper.Action(
         "ConfirmEmail", 
         "Account", 
         newRouteValues, 
         HttpContext.Current.Request.Url.Scheme 
         ); 

        string emailTitle = "Please confirm your account"; 
        string emailBody = "<a href='>" + callbackUrl + "'Please click Here to confirm your email</a>"; 

        await userManager.SendEmailAsync(user.Id, emailTitle, emailBody); 
       } 
       catch (Exception) 
       { 
        throw; 
       } 
      } 
+0

Пробовал это, и это сработало! Я использовал 'System.Web.Mvc.UrlHelper'. –

+0

Использование 'throw new Exception (ex.ToString()) просто ужасно. Просто используйте простой «бросок», чтобы не испортить опыт отладки у кого-то, улавливающего исключение. – ProfK

+1

@ProfK, Обновлен код. –

0

Чтобы создать URL-адрес mvc из веб-контекста api, вы можете использовать System.Web.Http.Routing.UrlHelper и его метод Link. Как это:

Url.Link("Default", new {Controller = "Account", Action = "Index");

Так генерировать URL из вашего кода, который необходимо пройти вниз UrlHelper от действия апи к AuthRepository. Не уверен, что это отличное решение, но, может быть, вы сможете построить его.

Смежные вопросы