Donc, voici le problème: Je construis des e-mails à envoyer par mon application en rendant les pages d'affichage complet aux chaînes et en les envoyant. Cela fonctionne sans problème tant que je ne redirige pas vers une autre URL sur le site par la suite. Chaque fois que j'essaie, je reçois "System.Web.HttpException: Impossible de rediriger après que les en-têtes HTTP ont été envoyés."Rendu de la vue à la chaîne suivie de la redirection des résultats en exception
Je crois que le problème vient du fait que je réutilise le contexte de l'action de contrôleur où l'appel pour créer le courrier vient. Plus spécifiquement, la réponse Http du contexte. Malheureusement, je ne peux pas créer une nouvelle HttpResponse qui utilise HttpWriter parce que le constructeur de cette classe est inaccessible, et l'utilisation de toute autre classe dérivée de TextWriter provoque une exception de réponse.Flush().
Quelqu'un at-il une solution pour cela?
public static string RenderViewToString(
ControllerContext controllerContext,
string viewPath,
string masterPath,
ViewDataDictionary viewData,
TempDataDictionary tempData)
{
Stream filter = null;
ViewPage viewPage = new ViewPage();
//Right, create our view
viewPage.ViewContext = new ViewContext(controllerContext,
new WebFormView(viewPath, masterPath), viewData, tempData);
//Get the response context, flush it and get the response filter.
var response = viewPage.ViewContext.HttpContext.Response;
//var response = new HttpResponseWrapper(new HttpResponse
// (**TextWriter Goes Here**));
response.Flush();
var oldFilter = response.Filter;
try
{
//Put a new filter into the response
filter = new MemoryStream();
response.Filter = filter;
//Now render the view into the memorystream and flush the response
viewPage.ViewContext.View.Render(viewPage.ViewContext,
viewPage.ViewContext.HttpContext.Response.Output);
response.Flush();
//Now read the rendered view.
filter.Position = 0;
var reader = new StreamReader(filter, response.ContentEncoding);
return reader.ReadToEnd();
}
finally
{
//Clean up.
if (filter != null)
filter.Dispose();
//Now replace the response filter
response.Filter = oldFilter;
}
}
Je souhaite utiliser le moteur WebForms pour créer les corps de messagerie eux-mêmes. Spark est plutôt sympa, mais je suis toujours plus à l'aise avec l'idée d'utiliser WebForms. En passant, par nouvelle demande, je suppose HttpServerUtility.Execute est bon? En ce qui concerne l'envoi synchrone, il ne doit pas être de cette façon, tout dépend des paramètres de SmtpClient n'est-ce pas? Comme je peux l'envoyer dans un dossier pour l'envoyer plus tard, ce n'est pas un problème. –