Widok renderowania do łańcucha, a następnie wyniki przekierowania w wyjątkowych przypadkach

Oto problem: buduję e-maile, które mają być wysyłane przez moją aplikację, wyświetlając pełne strony na łańcuchach i wysyłając je. Działa to bez problemu, o ile później nie przekierowuję do innego adresu URL w witrynie. Ilekroć próbuję, otrzymuję „System.Web.HttpException: Nie można przekierować po wysłaniu nagłówków HTTP”.

Uważam, że problem wynika z faktu, że używam kontekstu z akcji kontrolera, z której pochodzi wywołanie do tworzenia wiadomości e-mail. Dokładniej, HttpResponse z kontekstu. Niestety, nie mogę utworzyć nowego HttpResponse, który używa HttpWriter, ponieważ konstruktor tej klasy jest nieosiągalny, a użycie dowolnej innej klasy pochodzącej z TextWriter powoduje, że response.Flush () rzuca wyjątek.

Czy ktoś ma na to rozwiązanie?

    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;
        }
    }

questionAnswers(3)

yourAnswerToTheQuestion