4

繰り返しますが、MVC初心者に質問します。経験不足をお許しください。

MVC ルートを使用して大きな XML ファイルを返す状況があります。場合によっては、非常に大きくなることがあります。現在、私は StringBuilder を使用して必要な XML 出力を作成し、次のように返しています。

var sb = new StringBuilder();
XmlObject.WriteXml(sb);
return Content(sb.ToString(), "text/xml", Encoding.UTF8);

私が直面しているのは、(さまざまな理由で) XML ブログの生成にかなりの時間がかかる可能性があるということです。

XmlObject.WriteXml() メソッド内には、呼び出されたときに XML の断片を出力する他の小さなメソッドが多数呼び出されているため、すぐに XML 文字列の作成を開始します。完了するまでに時間がかかります。これらの各メソッドは StringBuilder を引数として受け入れるため、作成した後、各小さなメソッド内で sb.Append() を使用して最終的な XML BLOB を構築することで、それをあらゆる場所に渡すことができます。

わかりました。私がやりたいことは、文字列が構築され始めたらすぐにクライアントに何かを返し始めることです。Web フォームでは、すべての StringBuilder パラメータを HttpResponse に置き換え、次のような方法で StringBuilder.Append() の代わりに HttpResponse.Write() を使用します。

this.Response.BufferOutput = false;
XmlObject.WriteXml(Response);

次に、XML の小さな断片が応答に書き込まれるたびに、テキストがクライアントに送信されます。

私が抱えている問題は、ActionResult に return ステートメントが必要なことです。MVC ルートと ActionResult を使用して同様の方法で処理する方法がわかりません。おそらく、ActionResult 以外のものを使用する必要がありますか?

みんなありがとう!

4

5 に答える 5

4

アクション メソッドを returnvoidに変更してから、レスポンスに直接書き込むことができます。
(それは可能です、私はそれを試しました)

于 2010-11-05T20:53:32.123 に答える
2

を使用して大量の XML を構築するとStringBuilder、メモリに大きな負荷がかかる可能性があります。XML を深さ優先で記述できる場合は、XmlTextWriter.

潜在的に大量の XML を出力ストリームに書き込むサンプル コードを次に示します。

public ActionResult SiteMap()
{
    Response.ClearContent();
    Response.ContentType = "application/xml";
    Response.ContentEncoding = Encoding.UTF8;

    using (var context = new MyDataContext())
    {
        using (var xml = new XmlTextWriter(Response.Output))
        {
            xml.WriteStartElement("urlset",
                                  "http://www.sitemaps.org/schemas/sitemap/0.9");

            var url = new UrlHelper(Request.RequestContext);

            xml.WriteStartElement("url");
            xml.WriteElementString("loc", /* some URL */);
            xml.WriteEndElement();

            foreach (var blogPost in context.BlogPosts)
            {
                xml.WriteStartElement("url");
                xml.WriteElementString("loc", /* blog post URL */);
                xml.WriteEndElement();
            }

            xml.WriteEndElement();
            xml.Flush();
        }
    }

    return null;
}

sitemap.xmlこの特定の例は、文書の XML コンテンツを書き出すために使用するコードの短縮バージョンです。私の場合、ドキュメントには約 30,000 の URL があり、サイズは約 2.5MB です。

于 2011-06-13T14:45:10.710 に答える
2

MVC アクションの結果である必要がなく、テスト可能性/カプセル化を壊したくない場合は、これまでと同じように、応答に直接ストリームするカスタム IHttpHandler を使用して実行できます。

アップデート

サンプルは意味をなさないかもしれません-あなたの質問には概念があります。StringBuilder をスキップし、XmlTextWriter セットを使用して Response.OutputStream にストリーム配信し、仲介者をスキップするのはひねりだけです。

とはいえ、あなたが何をしているのかを読んでいるので、ストリーミングについて心配するのではなく、個人的には「オフラインで構築し、合理的にキャッシュする」という角度をとっています. 生よりも缶詰の方が扱いやすいかもしれません。

于 2010-11-05T22:31:28.280 に答える
0
public ActionResult Xml()
{
    string xmlString = "xml goes here...";
    return this.Content(xmlString, "text/xml", Encoding.UTF8);
}

リクエストごとに再生成したくない場合は、ActionResult をキャッシュすることを検討してください。[OutputCache] 属性を調べます。指定した時間など、パラメーターごとにキャッシュできます。

私はあなたが何を得ているのか分かりません.非同期のhttpリクエストのようなものをしたいようです. 一般的に言えば、そうではありません。クライアントは http リクエストを送信し、サーバーはレスポンスを生成して送り返します。

于 2010-11-05T21:00:45.340 に答える
0

最初にページを読み込んでわかりやすいコンテンツを表示し、次に AJAX を使用して汚い仕事をするアクション メソッドを呼び出すことができます。

于 2010-11-05T21:59:39.903 に答える