描画のための文字列の後にリダイレクトの成果の例外
-
18-09-2019 - |
質問
この問題:私はビルをeメールで送る私の応用によるレンダリングフルビューのページに文字列を送信します。この作品になっていない別のURLにリダイレクトのサイト。また、取得します。ます。HttpException:き後のリダイレクトのHTTPヘッダて送信されます。"
この問題の再利用しているコンテキストをコントローラのアクションの通話のe-mailが出ているのです。具体的には、httpresponseに対してのコンテキスト残念ながら、できない新しいhttpresponseに対して用HttpWriterでのコンストラクタのクラスは、到達不能使用のその他のクラスからTextWriter原因に応じます。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.エンジンです。FindPartialView"を"ViewEngines.エンジンです。FindView".
あなたが後にしているまさにんMVC ContribのEmailTemplateServiceを見てください。
http://mvccontrib.googlecode.com/svn /trunk/src/MVCContrib/Services/EmailTemplateService.csする
申し訳ありませんが、クリスは、かなり確実ではない私が考えていたものが、私は明らかに質問を読んでいません。 HttpResponse.Flush()あなたのフィルタにコンテンツをフラッシュする前にヘッダを送信します - 私はあなたにこの周りに道を譲ることはできませんが、私はあなたがエラーを取得している理由を伝えることができます。あなたがリダイレクトしようとすると、例外を取得するようにこれは、応答の内部フラグを設定します。
フラッシュ内のコードを見て反射板を使用して、私はあなたが反射し、他の意地の悪さがあまりなく、この問題を回避するためのいずれかのきれいな方法を参照することはできません。