ASP.NET + .NET Framework 3.5 でRSS配信 キャッシュあり

WCFを使った場合の解説は比較的多いが、ASP.NET (aspx) による配信で OutputCache を有効にする場合の例は余り出てこない。

Generate your own RSS feed with WCF: Syndication が参考になるが、やってみたら OutputCache がうまくいかなかった。実験したところ Response.End() を使ってしまうとASP.NETのキャッシュとして保存される前に処理が終了してしまうようなので、Response.End() を削除する必要があった。

コードビハインドなしの単一aspxファイルで作成してみたときの例:

<%@ Page Language="C#" ContentType="application/xml; charset=UTF-8" ResponseEncoding="UTF-8" %>
<%@ OutputCache Duration="3600" VaryByParam="*" %>
<%@ Import Namespace="System.Xml"%>
<%@ Import Namespace="System.Collections.Generic"%>
<%@ Import Namespace="System.ServiceModel.Syndication"%>
<script runat="server">
    protected void Page_Load(object sender, EventArgs e)
    {
        // 新しい配信フィードを作成します。
        var feed = new SyndicationFeed("Feed Title", "A WCF Syndication Feed", null);
        var items = new List<SyndicationItem>();

        // 新しい配信アイテムを作成します。
        var item = new SyndicationItem("An item", "Item content", null);
        items.Add(item);
        feed.Items = items;

        var formatter = new Rss20FeedFormatter(feed);
        Response.Clear();
        using (XmlWriter writer = XmlWriter.Create(Response.Output))
        {
            formatter.WriteTo(writer);
            writer.Flush();
        }
        // Response.End(); // Response.End() を書くとキャッシュが効かなくなる
    }
</script>

Encodingを明示的に指定しているので、Web.config の globalization によって他のファイルのエンコーディングをShift_JISなどに変更していてもUTF-8で出力される。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。