Il servizio WCF non riesce a inviare posta tramite MailDefinition

// stuff...... return SendCreationMail(Membership.GetUser((Guid)request.UserEntityId), request, new Control()); } private const string TemplateRoot = "~/app_shared/templates/mail/"; private const string ServerRoot = TemplateRoot + "server/"; public static bool SendCreationMail(MembershipUser user, IServerAccountRequest request, Control owner) { var definition = new MailDefinition { BodyFileName = string.Concat(ServerRoot, "creation.htm"), IsBodyHtml = true }; var subject = "New {0} account created!".FormatWith(request.ServerApplicationContract.Id); var data = ExtendedData(DefaultData, subject, user); data.Add("", request.ServerApplicationContract.Id); data.Add("", request.ServerApplicationContract.ApplicationName); data.Add("", request.AccountUsername); data.Add("", "/server/{0}/info".FormatWith(request.ServerApplicationContract.Id.ToLower())); return definition.CreateMailMessage(user.Email, data, owner).Send(subject, ApplicationConfiguration.MailSenderDisplayName); } 

Ottengo:

Il valore non può essere nullo. Nome del parametro: basepath

su System.Web.Util.UrlPath.Combine (String appPath, String basepath, String related)
a System.Web.UI.WebControls.MailDefinition.CreateMailMessage (destinatari stringa, sostituzioni IDictionary, proprietario controllo)
su Damnation.Website.Main.Common.MailTemplating.Server.SendCreationMail (utente MembershipUser, richiesta IServerAccountRequest, proprietario del controllo)
su Damnation.Website.Main.Common.MailTemplating.Server.SendCreationMail (richiesta IServerAccountRequest)
su Damnation.Website.Main.Business.Model.ServerAccountRequest.UpdateRequestsAfterServerProcessing (risultati IEnumerable`1)

Il fatto è che non ho un vero controllo da passare ad esso, mi piacerebbe sapere come impostare un controllo che eviti questa eccezione priva di senso. Sto usando un percorso relativo … quindi questo non ha senso.

L’applicazione che ha il servizio è in ASP.NET WebForms .NET 4. L’applicazione consumer è un’applicazione console anche in .NET 4

Ho avuto lo stesso problema e ho appreso che questo sta accadendo perché non riesce a trovare il percorso del controllo quando si tenta di eseguire la definizione.CreateMailMessage. Si desidera creare un controllo utente Web vuoto. Forse questa non è la soluzione più elegante ma funziona.

Questo è quello che ho fatto:

1) Aggiungere un file di controllo utente Web nel progetto, ad esempio Test.ascx.

2) Nel tuo file .svc aggiungi il seguente codice:

 Page page = new Page(); Test test = (Test)page.LoadControl("Test.ascx"); 

3) Aggiorna la tua definizione.CreateMailMessage line a:

 return definition.CreateMailMessage(user.Email, data, test).Send(subject, ApplicationConfiguration.MailSenderDisplayName); 

Non si otterrà più l’eccezione null di base.

Ho avuto lo stesso problema ma era perché ero su un’applicazione di console di progetto .NET, quando ho passato il codice a ASP.NET non eseguo bene senza creare Page e Test.