所以这是问题:我正在通过将完整视图页面呈现为字符串并发送它们来构建要由我的应用程序发送的电子邮件。只要我之后不重定向到该网站上的另一个 URL,此操作就不会出现任何问题。每当我尝试时,我都会收到“System.Web.HttpException:发送 HTTP 标头后无法重定向。”

我相信问题来自于我正在重用控制器操作中的上下文,其中创建电子邮件的调用来自于此。更具体地说,来自上下文的 HttpResponse。不幸的是,我无法创建一个使用 HttpWriter 的新 HttpResponse,因为该类的构造函数无法访问,并且使用从 TextWriter 派生的任何其他类都会导致 response.Flush() 本身引发异常。

有人有解决方案吗?

    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;
        }
    }
有帮助吗?

解决方案

您不得不发起一个新的请求。 位,你真的要发送电子邮件同步这样?如果邮件服务器关闭时,用户可能会等待了好一阵。

我总是把电子邮件脱机队列,并有一个服务邮箱当中。您可以考虑使用此星火模板引擎。

其他的一种方法是不定向但具有元重定向代码写出一个页面

其他提示

这是将视图呈现为字符串的另一种方法,该方法永远不会导致数据输出到响应(因此它应该避免您的问题): http://craftycodeblog.com/2010/05/15/asp-net-mvc-render-partial-view-to-string/

要渲染常规视图而不是部分视图,您需要将“ViewEngines.Engines.FindPartialView”更改为“ViewEngines.Engines.FindView”。

有一个看看MVC的Contrib EmailTemplateService这确实你是什么了。

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

对不起克里斯,搞不清我在想什么,但我显然没有阅读问题。虽然我不能给你解决的办法,我可以告诉你为什么你所得到的错误 - HttpResponse.Flush()的内容刷新到过滤器,然后发送头。这将设置一个标志的响应里面,这样当您尝试重定向你得到的异常。

使用反射来看看里面冲洗的代码,我看不出你来解决这个问题没有大量的反射和其他污秽任何清洁方式。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top