Frage

Hier ist also die Frage: Ich baue E-Mails durch eine Bewerbung geschickt wird durch Rendering Großansicht Seiten in Strings und Senden von ihnen. Dies funktioniert ohne Probleme, solange ich danach nicht mehr auf eine andere URL auf der Website umgeleitet wird. Jedes Mal, wenn ich versuche, erhalte ich „System.Web.HttpException: Kann nicht umleiten, nachdem HTTP-Header gesendet wurden.“

Ich glaube, das Problem kommt von der Tatsache ich den Kontext aus dem Controller-Aktion bin Wiederverwendung von wo der Anruf für die Erstellung der E-Mail kommt. Mehr die Httpresponse aus dem Zusammenhang gesagt. Leider kann ich kein neues Httpresponse erstellen, die Verwendung von Httpwriter da der Konstruktor dieser Klasse macht, ist nicht erreichbar, und mit jeder anderen Klasse abgeleitet von Textwriter verursacht Response.Flush () eine Ausnahme zu werfen, selbst.

Hat jemand eine Lösung für dieses?

    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;
        }
    }
War es hilfreich?

Lösung

würden Sie haben eine neue Anfrage zu starten. Bit, wollen Sie wirklich E-Mails synchron auf diese Weise senden? Wenn der Mail-Server ausfällt, kann der Benutzer könnte eine gute Weile warten.

Ich habe E-Mails in einer Offline-Warteschlange und hat immer einen Dienst sie schicken. Sie betrachten könnten die Spark-Template-Engine für diese verwendet wird.

Ein weiterer Ansatz ist nicht zu umleiten, sondern eine Seite mit einem Meta-Weiterleitungs-Tag schreibt

Andere Tipps

Hier ist eine alternative Methode für eine Ansicht auf einen String-Rendering, die nie ausgegeben wird auf die Antwort in Daten führt (daher sollte es Ihr Problem vermeiden): http://craftycodeblog.com/2010/05/15/asp-net-mvc-render-partial -Blick-to-string /

Um eine reguläre Ansicht anstelle einer Teilansicht zu machen, werden Sie ändern müssen „ViewEngines.Engines.FindPartialView“ auf „ViewEngines.Engines.FindView“.

Haben Sie einen Blick auf die MVC Contrib EmailTemplateService was tut genau das, was Sie nach.

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

Leider Chris, nicht ganz sicher, was ich dachte, aber ich habe natürlich nicht die Frage lesen. Während ich Ihnen einen Weg, um dieses nicht geben kann, kann ich Ihnen sagen, warum Sie den Fehler bekommen - HttpResponse.Flush () sendet die Header, bevor Sie den Inhalt Ihrer Filterspülung. Dies setzt ein Flag in der Antwort, so dass, wenn Sie versuchen Sie die Ausnahme umleiten erhalten.

Reflektor am Code in Flush zu sehen, kann ich keine saubere Art und Weise sehen Sie ohne viel Reflexion und anderen Gemeinheiten, dies zu umgehen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top