Domanda

Quindi ecco il problema:Sto creando e-mail da inviare dalla mia applicazione trasformando le pagine a visualizzazione completa in stringhe e inviandole.Funziona senza problemi purché in seguito non venga reindirizzato a un altro URL sul sito.Ogni volta che provo, ottengo "System.Web.HttpException:Impossibile reindirizzare dopo l'invio delle intestazioni HTTP."

Credo che il problema derivi dal fatto che sto riutilizzando il contesto dell'azione del controller da cui proviene la chiamata per la creazione dell'e-mail.Più specificamente, HttpResponse dal contesto.Sfortunatamente, non posso creare un nuovo HttpResponse che utilizzi HttpWriter perché il costruttore di quella classe non è raggiungibile e l'utilizzo di qualsiasi altra classe derivata da TextWriter fa sì che Response.Flush() generi un'eccezione.

Qualcuno ha una soluzione per questo?

    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;
        }
    }
È stato utile?

Soluzione

Dovresti avviare una nuova richiesta.Bit, vuoi davvero inviare e-mail in modo sincrono in questo modo?Se il server di posta è inattivo, l'utente potrebbe attendere a lungo.

Inserisco sempre le e-mail in una coda offline e faccio in modo che un servizio le invii per posta.Potresti prendere in considerazione l'utilizzo del motore del modello Spark per questo.

Un altro approccio consiste nel non reindirizzare ma scrivere una pagina con un tag meta reindirizzamento

Altri suggerimenti

Ecco un metodo alternativo per il rendering in vista di una stringa che non si traduce in dati viene emesso alla risposta (quindi dovrebbe evitare il problema): http://craftycodeblog.com/2010/05/15/asp-net-mvc-render-partial -view-to-string /

Per effettuare il rendering di una vista normale invece di una vista parziale, è necessario cambiare "ViewEngines.Engines.FindPartialView" a "ViewEngines.Engines.FindView".

Dai un'occhiata al MVC Contrib EmailTemplateService che fa esattamente quello che cercate.

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

Siamo spiacenti Chris, non del tutto sicuro di quello che stava pensando, ma io ovviamente non ha letto la questione. Mentre io non posso darvi un modo per aggirare questo, posso dirvi perché hai trovato l'errore - HttpResponse.Flush () invia le intestazioni prima di lavare il contenuto al filtro. Questo imposta un flag all'interno della risposta in modo che quando si tenta di reindirizzare si ottiene l'eccezione.

Utilizzando riflettore di guardare il codice all'interno Flush, non riesco a vedere alcun modo pulito per voi per ottenere intorno a questo senza un sacco di riflessione e di altre cattiveria.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top