連載:実践! WCFプログラミング

第1回 WCFを使用してRSS/Atomフィーダを作成する

デジタルアドバンテージ 岸本 真二郎
2008/06/27
Page1 Page2 Page3 Page4

実際にどのように配信するか?

 このWCF配信サービス・ライブラリのプロジェクトでビルドして得られる生成物は、WCFサービスのライブラリ(.DLL)である。残念ながらこれが出来上がっただけでは、実際のフィードの配信は行えない。WCFではこのサービスをホストするプロセスが必要となる。

 WCFでサービスをホストするには次の2つの方法が用意されている。

  1. スタンドアロンで実行(ホスト)するアプリケーション(WebServiceHostクラスを使用する)を作成する
  2. IISでホストする

 1では、WCFサービスをホストするプロセスを別途作成して実行する必要があるので、現実的なRSS/Atomフィードの配信には向いていないと思われる。ただしそのようなアプリケーションの実装は難しくなく、コンソール・アプリケーションのプロジェクトを作成して、次のように記述することでサービスを開始できる。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using System.ServiceModel.Web;

namespace ConsoleHost
{
  class Program
  {
    static void Main(string[] args)
    {
      using(WebServiceHost host = new WebServiceHost(
        typeof(SyndicationServiceLibrary1.Feed1),
        new Uri("http://localhost:8000/MyService"))) { // URLは任意

        host.Open();
        Console.WriteLine(
          "サービスを実行中。キーを押すと終了します");
        Console.Read();
      }
    }
  }
}
Imports System.ServiceModel
Imports System.ServiceModel.Web

Module Module1

  Sub Main()
    Dim host As WebServiceHost = _
      New WebServiceHost(GetType(SyndicationServiceLibrary.Feed), _
      New Uri("http://localhost:8000/MyService")) ' URLは任意

    If Not (host Is Nothing) Then '
      host.Open()
      Console.WriteLine("サービスを実行中。キーを押すと終了します")
      Console.Read()
    End If
  End Sub

End Module
リスト9 コンソール・アプリケーションでRSS/Atomを配信する(上:C#、下:VB)

 WCFではHTTPプロトコルを使用するサービスに、WebサーバであるIISが利用できるので、以降では2のIISを使って配信する方法を紹介する。このほかに、Windows Vista、Windows Server 2008などで利用できるWAS(Windows Activation Service)を利用することも可能だが、ここでは省略する。

IISでフィードを配信する

 IISでRSS/Atomフィードを配信するには、いくつか準備が必要となる。

■仮想ディレクトリ

 適当なフォルダを用意し、さらにそこに「bin」フォルダを作成して、作成したライブラリ(SyndicationServiceLibrary1.dll)をコピーする。

 次にIISの管理ツールを起動して仮想ディレクトリを作成する(仮想ディレクトリを作成する場合)。前述のフォルダを仮想ディレクトリとしてマッピングし、ASP.NETが利用できるように設定しておく(ASP.NETのバージョンは2.0を指定する)。

■サービス・ファイル(.svc)を用意

 仮想ディレクトリに、拡張子が「.svc」のファイルを作成する(ファイル名は何でもよい。ここでは「feed.svc」とした)。この中には次のようにサービスを提供するクラス名を記述する。

<%@ServiceHost Service="SyndicationServiceLibrary1.Feed1" Language="C#"  %>

■Web.configの修正

 次に仮想ディレクトリのWeb.configを修正する。プロジェクトに含まれるApp.configの中の <system.serviceModel>要素すべてを、Web.configの<configuration>要素の中にコピーする。

 なお、WCFで用いるプロトコルがHTTPの場合にはURLでアドレスが決まるため、<system.serviceModel>要素に含まれる<baseAddresses>要素は必要ないのだが、そのままにしておく(コメントアウトしても構わない)。

■ブラウザで動作確認

 仮に仮想ディレクトリの名前を「rss」とし、仮想ディレクトリに作成した.svcファイルの名前が「feed.svc」とすると、ブラウザから、

http://localhost/rss/feed.svc/Feed1

というURLを指定すると、VS 2008でのデバッグ時に表示された内容と同様のものが表示されるはずだ。

■IISで正しく表示されない場合

 ブラウザで結果が正しく表示されない場合は、.svcファイルに対応するハンドラがIISに設定されていない可能性が高い。この場合には、「IIS ホスト サービスのエラー」や「How to: Host a WCF Service in IIS」を参照して、サービスのハンドラが正しくIISに設定されているか確認していただきたい。

 なお、Windows Server 2008の場合(IIS7)で、「サーバ マネージャ」の「機能の追加」により.NET Framework 3.0をインストールしている場合は、すでにホスト・サービスの設定が行われている。このため、.svcファイルのハンドラの設定は不要である。


Windows Server 2008に含まれるIISの管理ツール

そのほか

 以上の設定でIISからRSSの配信が行えるようになった。VS 2008が提供するテンプレートのプロジェクトを利用することで、フィードの中身を構築する以外は、ほとんど何の記述も付け足す必要がなかったことがお分かりいただけたことと思う。

■静的な配信:配信内容をXMLファイルとしてエクスポートする

 さらに、ここで作成したRSS/Atomフィードのライブラリを使って、IISから動的にフィードを返すのではなく、フィードの内容をファイルに保存する方法を紹介しておこう。Windowsコンソール・アプリケーションのプロジェクトを作成し、先ほど作成したライブラリへの参照を追加しておく。そして以下のようなコードを記述する。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using SyndicationServiceLibrary1;
using System.ServiceModel.Syndication;

namespace Export
{
  class Program
  {
    static void Main(string[] args)
    {
      Feed1 feed = new Feed1();
      SyndicationFeedFormatter fmt = feed.CreateFeed();

      XmlWriterSettings settings = new XmlWriterSettings();
      settings.Indent = true;
      settings.IndentChars = ("  ");
      using (XmlWriter writer = XmlWriter.Create("C:\\rss.xml", settings)) {
        fmt.WriteTo(writer); // ファイルに書き出す
      }
    }
  }
}
Imports System.ServiceModel.Syndication
Imports SyndicationServiceLibrary
Imports System.Xml

Module Module1
  Sub Main()
    Dim feed As Feed = New Feed()
    Dim fmt As SyndicationFeedFormatter = feed.CreateFeed()

    Dim settings As XmlWriterSettings = New XmlWriterSettings()
    settings.Indent = True
    settings.IndentChars = ("  ")

    Dim writer As XmlWriter = XmlWriter.Create("C:\rss.xml", settings)
    fmt.WriteTo(writer) ' ファイルに書き出す
    writer.Close()
  End Sub
End Module
リスト10 RSSフィードをファイルに保存する(上:C#、下:VB)

 WCFのサービス・クラスでは、CreateFeedメソッドでSyndicationFeedFormatterクラスのインスタンスを返していたが、このCreateFeedメソッドをそのまま呼び出してSyndicationFeedFormatterクラスのインスタンスを取得し、WriteToメソッドを使ってXMLファイルに出力している。

 このようにして出力したファイル(ここでは「rss.xml」)は、Webサーバにコピーすれば、RSSの配信が行えるようになる。この場合は単に生成されたフィードを仮想ディレクトリ(または仮想Webサーバ)に配置するだけなので、IISの設定などは不要だ(WebサーバによってはMIMEの設定が必要な場合があるかもしれない)。

 IISが動作している環境からデータベースにアクセスすることが難しい場合や、リクエストを受けるたびに動的にフィードを返したくない場合は、こういった運用方法も考えられる。End of Article

 

 INDEX
  実践! WCFプログラミング
  第1回 WCFを使用してRSS/Atomフィーダを作成する
    1.WCFとは?/RSS/Atomとは?
    2.RSS/Atomフィーダのプログラミング
    3.フィード本体の作成
  4.実際にどのように配信するか?/IISでフィードを配信する
 
インデックス・ページヘ  「実践! WCFプログラミング」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間