Question

Alors voici la question: Je construis des e-mails envoyés par ma demande en rendant les pages de vue plein de chaînes et de les envoyer. Cela fonctionne sans aucun problème tant que je ne suis pas la redirection vers une autre URL sur le site par la suite. Chaque fois que j'essaie, je reçois « System.Web.HttpException: ne peut pas rediriger après en-têtes HTTP ont été envoyés. »

Je crois que le problème vient du fait que je suis réutilisant le contexte de l'action du contrôleur où l'appel à la création de l'e-mail provient. Plus précisément, le HttpResponse 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 Response.Flush () pour lancer une exception, elle-même.

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;
        }
    }
Était-ce utile?

La solution

Il faudrait lancer une nouvelle demande. Bit, voulez-vous vraiment envoyer des e-mails de manière synchrone cette façon? Si le serveur de messagerie est en panne, l'utilisateur peut attendre un bon moment.

J'ai toujours mis dans une file d'attente des e-mails hors ligne et un service leur courrier. Vous pouvez envisager d'utiliser le moteur de modèle Spark pour cela.

Une autre approche est de ne pas rediriger mais écrire une page avec une balise meta redirection

Autres conseils

Voici une autre méthode pour rendre une vue d'une chaîne qui ne se traduit par des données étant sortie à la réponse (donc il faut éviter que votre problème): http://craftycodeblog.com/2010/05/15/asp-net-mvc-render-partial -Voir à chaîne /

Pour rendre une vue régulière au lieu d'une vue partielle, vous aurez besoin de changer « ViewEngines.Engines.FindPartialView » à « ViewEngines.Engines.FindView ».

Jetez un oeil à la MVC Contrib EmailTemplateService qui fait exactement ce que vous recherchez.

http://mvccontrib.googlecode.com/svn /trunk/src/MVCContrib/Services/EmailTemplateService.cs

Désolé Chris, pas tout à fait sûr de ce que je pensais mais je ne évidemment pas lu la question. Bien que je ne peux pas vous donner un moyen de contourner cela, je peux vous dire pourquoi vous obtenez l'erreur - HttpResponse.Flush () envoie les en-têtes avant de rincer le contenu de votre filtre. Ceci définit un drapeau dans la réponse de sorte que lorsque vous essayez de vous rediriger obtenez l'exception.

Utilisation de réflecteur pour regarder le code à l'intérieur Flush, je ne vois aucune façon propre pour que vous puissiez vous déplacer cela sans beaucoup de réflexion et d'autres méchancetés.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top