2016-07-14 15 views
0

Mit ASP.NET MVC5 mit Microsoft.AspNet.Identity v2.2.1 (aktueller neuester Version)ASPnet MVC Identität - SendAsync Httpstatuscode

Ist es möglich, den Httpstatuscode von dieser SendAsync E-Mail-Methode zurückgeben?

Es läuft gut, Senden einer E-Mail. Das Problem ist, wenn der Dienst mit einem nicht 200 HttpStatusCode fehlschlägt, wird es verschluckt. Ich möchte, dass der Benutzer benachrichtigt wird, wenn die E-Mail nicht zugestellt werden kann.

public class EmailService : IIdentityMessageService 
{ 
    public async Task SendAsync(IdentityMessage message) 
    { 
     var client = new RestClient 
     { 
      BaseUrl = new Uri("https://api.mailgun.net/v3"), 
      Authenticator = new HttpBasicAuthenticator("api", GetMailGunKey()) 
     }; 
     var request = new RestRequest(); 
     request.AddParameter("domain", "mg.davestopmusic.com", ParameterType.UrlSegment); 
     request.Resource = "{domain}/messages"; 
     request.AddParameter("from", "Dave Mateer <[email protected]>"); 
     request.AddParameter("to", message.Destination); 
     request.AddParameter("subject", message.Subject); 
     request.AddParameter("text", message.Body); 
     request.AddParameter("html", message.Body); 
     request.Method = Method.POST; 

     var response = await client.ExecuteTaskAsync(request); 
     int sc = (int) response.StatusCode; 
     if (response.StatusCode != HttpStatusCode.OK) 
     { 
      // display the status code to the user 
     } 
    } 

E-Mail Bestätigung und Passwort-Reset-Funktionalität Änderungen von hier:

http://www.asp.net/mvc/overview/security/create-an-aspnet-mvc-5-web-app-with-email-confirmation-and-password-reset

Die Versuchung, einen anderen Identitätsanbieter in der Hoffnung zu gehen, ist es ist erweiterbar: https://github.com/brockallen/BrockAllen.MembershipReboot https://weblog.west-wind.com/posts/2015/Apr/29/Adding-minimal-OWIN-Identity-Authentication-to-an-Existing-ASPNET-MVC-Application

Ich brauche keine externe Authentifikation.

Vielleicht brauche ich eine andere Methode, die den StatusCode zurückgibt und dies irgendwie anstelle von SendAsync verdrahtet.

public Task<int> SendAsync2(IdentityMessage message) 
{ 
    // blah 
    int sc = (int) response.StatusCode; 
    return Task.FromResult(sc); 
} 

Antwort

0

ich Postal bin mit, so dass mein Prozess ein bisschen anders ist, aber was ich tue, ist ein Wurf Ausnahme und verwenden Sie eine Ausnahmebehandlung, um beim erneuten Anzeigen des Formulars eine Nachricht anzuzeigen. Hier ist eine vereinfachte Version davon:

1) Werfen Sie eine Ausnahme, wenn der Statuscode ist nicht das, was Sie erwartet:

if (response.StatusCode != HttpStatusCode.OK) 
{ 
    // Create this exception at some point. 
    // It doesn't need to do anything except inherit Exception 
    throw new MyCustomEmailException(); 
} 

2) Fangen Sie die Ausnahme in der Aktion, die in Ihrer E-Mail-Dienst ruft:

[HttpPost] 
public async Task<ActionResult> ResetPassword(Models.PasswordResetForm model) 
{ 
    try 
    { 
     // Call your email sending code... 
    } 
    catch(MyCustomEmailException ex) 
    { 
     // Remember to log the exception 

     ModelState.AddModelError(string.Empty, "We're sorry, we could not complete this request. Please wait a moment and then try again"); 
    } 

    return View(model); 
} 

Sie können auch E-Mail an einen separaten Prozess, wie Hangfire, das Senden von Offloading betrachten, obwohl das einig Refactoring erfordern würde (man ein Verfahren zur Aufzeichnung benötigen, ob eine E-Mail gesendet wurde, so dass Sie, wenn Sie wissen müssen wiederholen).

+0

Danke Tieson - genau was ich brauchte! Exception-Wurf-Lösung funktioniert gut. Postal/Hangfire Gedanken zu groß. –

0

Ich glaube, Sie andere Methode verwenden, müssen Anfrage senden, so etwas wie diese

client.ExecuteAsync(request, response => 
{ 
    int sc = (int)response.StatusCode; 
    if (response.StatusCode != HttpStatusCode.OK) 
    { 
     // display the status code to the user 
    } 
}); 
+0

Dank Nguyen - der ursprüngliche Aufruf client.ExecuteTaskAsync (Anfrage) funktioniert gut. Ihr Codebeispiel macht eine ähnliche Sache - interessant, um es neu geschrieben zu sehen. Es ist wie mit Antwortcodes umzugehen ist, die das Problem sind. –

Verwandte Themen