문제

문제는 다음과 같습니다. 전체보기 페이지를 문자열로 렌더링하고 보내는 전자 메일을 응용 프로그램에서 전자 메일로 작성하고 있습니다. 나중에 사이트의 다른 URL로 리디렉션하지 않는 한 문제없이 작동합니다. 시도 할 때마다 "System.web.httpexception : HTTP 헤더가 전송 된 후에는 리디렉션 할 수 없습니다."

문제는 전자 메일 생성 호출이 발생하는 컨트롤러 동작의 컨텍스트를 재사용한다는 사실에서 비롯된 것입니다. 보다 구체적으로, 컨텍스트의 Httpresponse. 불행히도, 나는 해당 클래스의 생성자가 도달 할 수없고 TextWriter에서 파생 된 다른 클래스를 사용하면 response.flush ()가 예외를 던지기 때문에 httpwriter를 사용하는 새로운 httpresponse를 만들 수 없습니다.

누구든지 이것에 대한 해결책이 있습니까?

    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;
        }
    }
도움이 되었습니까?

해결책

새로운 요청을 시작해야합니다. 물론, 당신은 정말로 이런 식으로 이메일을 동시에 보내고 싶습니까? 메일 서버가 다운되면 사용자는 잠시 동안 기다릴 수 있습니다.

나는 항상 오프라인 대기열에 이메일을 넣고 서비스 메일을 가지고 있습니다. 이를 위해 Spark Template 엔진을 사용하는 것을 고려할 수 있습니다.

다른 방법 중 하나는 리디렉션되지 않고 메타 리디렉션 태그가있는 페이지를 작성하는 것입니다.

다른 팁

다음은 데이터를 응답에 출력하지 않는 문자열을 렌더링하는 대체 방법입니다 (따라서 문제를 피해야 함). http://craftycodeblog.com/2010/05/15/asp-net-mvc-render-partial-view-to-string/

부분보기 대신 정기적 인보기를하려면 "viewengines.engines.findpartialview"를 "viewengines.engines.findview"로 변경해야합니다.

MVC Contrib emailTemplatesService를 살펴보십시오.

http://mvccontrib.googlecode.com/svn/trunk/src/mvccontrib/services/emailtemplateservice.cs

죄송합니다 Chris, 내가 무슨 생각을했는지 잘 모르겠지만 분명히 질문을 읽지 않았습니다. 이 문제를 해결할 수는 없지만 오류가 발생하는 이유를 알려줄 수 있습니다 -httpresponse.flush ()는 내용을 필터에 플러시하기 전에 헤더를 보냅니다. 이렇게하면 응답 내부에 플래그가 설정되어 리디렉션을 시도하면 예외가 발생합니다.

반사기를 사용하여 플러시 내부의 코드를보기 위해 많은 반사와 다른 nastiness 없이이 문제를 해결할 수있는 깨끗한 방법을 볼 수 없습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top