17

応答の BinaryWrite メソッドを使用してストリームをレンダリングするビューがあります。これは、Beta 2 を使用する ASP.NET 4 ではすべて正常に機能しましたが、RC リリースでは次の例外がスローされます。

"HttpException" 、"カスタム TextWriter が使用されている場合、OutputStream は使用できません。"

<%@ Page Title="" Language="C#" Inherits="System.Web.Mvc.ViewPage" %>
<%@ Import Namespace="System.IO" %>
<script runat="server">
protected void  Page_Load(object sender, EventArgs e)
{
    if (ViewData["Error"] == null)
    {

        Response.Buffer = true;
        Response.Clear();
        Response.ContentType = ViewData["DocType"] as string;
        Response.AddHeader("content-disposition", ViewData["Disposition"] as string);
        Response.CacheControl = "No-cache";
        MemoryStream stream = ViewData["DocAsStream"] as MemoryStream;
        Response.BinaryWrite(stream.ToArray());
        Response.Flush();
        Response.Close();
    }
}   
</script>


</script>

ビューは、クライアント側のリダイレクトから生成されます (もちろん、リンクをレンダリングするために Url.Action ヘルパーを使用して、前のページの jquery replace location 呼び出し)。これはすべてiframeにあります。

なぜこれが起こるのか誰にも分かりますか?

4

3 に答える 3

17

ViewPage が実行を開始すると、残りのリクエストについて特定のことが想定されます。あなたをつまずかせている特定のことは、ViewPage が要求の残りの部分が通常の HTML またはその他のテキスト応答であると想定しているため、応答の TextWriter を独自のライターに切り替えることです。

あなたの場合、ExecuteResult メソッドが Page_Load メソッドのロジックをカプセル化する新しい ActionResult 派生クラスを作成する必要があります。アクション メソッドはカスタム クラスのインスタンスを返す必要があり、呼び出し元は適切なタイミングで ExecuteResult メソッドを実行します。これにより、ビュー エンジンが完全にバイパスされ、実行中のエラーが回避され、パフォーマンスがわずかに向上します。

于 2010-02-15T03:28:36.860 に答える
11

私はリヴァイの答えをしました。実は超簡単です。私のコードは、さまざまなチェックの後にファイルシステムから以前に取得した画像を応答に書き込みます。

public class BookImageResult : ActionResult
{
    private readonly GraphicReport graphicReport;

    public BookImageResult(GraphicReport graphicReport)
    {
        this.graphicReport = graphicReport;
    }

    public override void ExecuteResult(ControllerContext context)
    {
        var response = context.RequestContext.HttpContext.Response;
        response.Clear();
        response.ContentType = graphicReport.ContentType;
        response.BinaryWrite(graphicReport.Image);
        response.End();
    }
}

コントローラーの最後の行は次のようになります。

return new BookImageResult(graphicReport);

誰かがリヴァイの答えを答えとしてマークしてください!

于 2010-02-26T16:29:31.557 に答える
2

同様のことを行う別の方法は、組み込みを使用することですFile ActionResult

var bytes = GetPdfBytes("Performance Report", htmlString);
return File(bytes, "binary/octet-stream", "Performance Report.pdf");
于 2011-09-15T03:09:18.973 に答える