Pergunta

Então, aqui está o problema: Eu estou construindo e-mails para serem enviados pelo meu aplicativo, tornando completos vista páginas para cordas e enviá-los. Isso funciona sem qualquer problema, desde que eu não estou redirecionando para outro URL no site depois. Sempre que eu tento, eu recebo "System.Web.HttpException:. Não é possível redirecionar depois de cabeçalhos HTTP foram enviadas"

Eu acredito que o problema vem do fato de que eu estou reutilizando o contexto da ação do controlador onde a chamada para criar o e-mail vem. Mais especificamente, o HttpResponse a partir do contexto. Infelizmente, eu não posso criar uma nova HttpResponse que faz uso de HttpWriter porque o construtor dessa classe é inacessível, e usando qualquer outra classe derivada de TextWriter provoca Response.Flush () para lançar uma exceção, em si.

Alguém tem uma solução para isso?

    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;
        }
    }
Foi útil?

Solução

Você teria que iniciar uma nova solicitação. Bit, você realmente deseja enviar e-mails de forma síncrona desta maneira? Se o servidor de correio está em baixo, o usuário poderia estar esperando um bom tempo.

Eu sempre colocar e-mails em uma fila offline e ter um serviço de correio-los. Você pode considerar o uso do modelo de motor de ignição por isso.

Uma outra abordagem é a de não redirecionar, mas escrever uma página com uma tag meta redirect

Outras dicas

Aqui é um método alternativo para a prestação vista a uma cadeia que nunca resulta em dados sendo transmitidos para a resposta (por isso deve evitar o problema): http://craftycodeblog.com/2010/05/15/asp-net-mvc-render-partial -view-a-corda /

Para renderizar uma visão regular em vez de uma visão parcial, você precisa mudar "ViewEngines.Engines.FindPartialView" para "ViewEngines.Engines.FindView".

Tenha um olhar para o MVC Contrib EmailTemplateService que faz exatamente o que você está depois.

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

Desculpe Chris, não é completamente certo o que eu estava pensando, mas eu obviamente não leu a pergunta. Enquanto eu não posso dar-lhe uma maneira de contornar isso, posso dizer-lhe por que você está recebendo o erro - HttpResponse.Flush () envia os cabeçalhos antes de descarregar o conteúdo para o seu filtro. Isso define uma bandeira dentro da resposta de modo que quando você tenta redirecionar você começa a exceção.

Usando o refletor para olhar para o código dentro nivelado, eu não posso ver nenhuma maneira limpa para você obter em torno deste sem muita reflexão e outra maldade.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top