Так вот в чем проблема: я создаю электронные письма, которые будут отправлены моим приложением, переводя страницы полного просмотра в строки и отправляя их. Это работает без каких-либо проблем, если я не буду перенаправлять на другой URL на сайте впоследствии. Всякий раз, когда я пытаюсь, я получаю «System.Web.HttpException: не удается перенаправить после отправки заголовков HTTP.»
Я полагаю, что проблема связана с тем, что я повторно использую контекст из действия контроллера, откуда поступает вызов для создания электронной почты. Более конкретно, HttpResponse из контекста. К сожалению, я не могу создать новый HttpResponse, который использует HttpWriter, потому что конструктор этого класса недоступен, а использование любого другого класса, производного от 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;
}
}