Share via


方法: 基本的な ATOM フィードを作成する

Windows Communication Foundation (WCF) では、配信フィードを公開するサービスを作成できます。 ここでは、ATOM 配信フィードを公開する配信サービスを作成する方法について説明します。

基本的な配信サービスを作成するには

  1. WebGetAttribute 属性でマークされたインターフェイスを使用して、サービス コントラクトを定義します。 配信フィードとして公開される各操作は、Atom10FeedFormatter オブジェクトを返す必要があります。

    [ServiceContract]
    public interface IBlog
    {
        [OperationContract]
        [WebGet]
        Atom10FeedFormatter GetBlog();
    }
    
    <ServiceContract()> _
    Public Interface IBlog
        <OperationContract()> _
        <WebGet> _
        Function GetBlog() As Atom10FeedFormatter
    End Interface
    

    Note

    WebGetAttribute を適用するすべてのサービス操作は、HTTP GET 要求にマッピングされます。 他の HTTP メソッドに操作をマッピングするには、代わりに WebInvokeAttribute を使用します。 詳細については、「方法: 基本的な WCF Web HTTP サービスを作成する」を参照してください。

  2. サービス コントラクトを実装します。

    public class BlogService : IBlog
    {
        public Atom10FeedFormatter GetBlog()
        {
            SyndicationFeed feed = new SyndicationFeed("My Blog Feed", "This is a test feed", new Uri("http://SomeURI"), "FeedOneID", new DateTimeOffset(DateTime.Now));
            feed.Authors.Add(new SyndicationPerson("someone@microsoft.com"));
            feed.Categories.Add(new SyndicationCategory("How To Sample Code"));
            feed.Description = new TextSyndicationContent("This is a sample that illustrates how to expose a feed using ATOM with WCF");
    
            SyndicationItem item1 = new SyndicationItem(
                "Item One",
                "This is the content for item one",
                new Uri("http://localhost/Content/One"),
                "ItemOneID",
                DateTime.Now);
    
            SyndicationItem item2 = new SyndicationItem(
                "Item Two",
                "This is the content for item two",
                new Uri("http://localhost/Content/Two"),
                "ItemTwoID",
                DateTime.Now);
    
            SyndicationItem item3 = new SyndicationItem(
                "Item Three",
                "This is the content for item three",
                new Uri("http://localhost/Content/three"),
                "ItemThreeID",
                DateTime.Now);
            List<SyndicationItem> items = new List<SyndicationItem>();
    
            items.Add(item1);
            items.Add(item2);
            items.Add(item3);
    
            feed.Items = items;
            return new Atom10FeedFormatter(feed);
        }
    }
    
    Public Class BlogService
        Implements IBlog
        Public Function GetBlog() As Atom10FeedFormatter Implements IBlog.GetBlog
            Dim feed As New SyndicationFeed("My Blog Feed", "This is a test feed", New Uri("http://SomeURI"), "FeedOneID", new DateTimeOffset(DateTime.Now))
            feed.Authors.Add(New SyndicationPerson("someone@microsoft.com"))
            feed.Categories.Add(New SyndicationCategory("How To Sample Code"))
            feed.Description = New TextSyndicationContent("This is a sample that illustrates how to expose a feed imports ATOM with WCF")
    
            Dim item1 As New SyndicationItem( _
                "Item One", _
                "This is the content for item one", _
                New Uri("http://localhost/Content/One"), _
                "ItemOneID", _
                DateTime.Now)
    
            Dim item2 As New SyndicationItem( _
                "Item Two", _
                "This is the content for item two", _
                New Uri("http://localhost/Content/Two"), _
                "ItemTwoID", _
                DateTime.Now)
    
            Dim item3 As New SyndicationItem( _
                "Item Three", _
                "This is the content for item three", _
                New Uri("http://localhost/Content/three"), _
                "ItemThreeID", _
                DateTime.Now)
            Dim items As New List(Of SyndicationItem)()
    
            items.Add(item1)
            items.Add(item2)
            items.Add(item3)
    
            feed.Items = items
            Return New Atom10FeedFormatter(feed)
        End Function
    End Class
    
  3. SyndicationFeed オブジェクトを作成し、作成者、カテゴリ、および説明を追加します。

    SyndicationFeed feed = new SyndicationFeed("My Blog Feed", "This is a test feed", new Uri("http://SomeURI"), "FeedOneID", new DateTimeOffset(DateTime.Now));
    feed.Authors.Add(new SyndicationPerson("someone@microsoft.com"));
    feed.Categories.Add(new SyndicationCategory("How To Sample Code"));
    feed.Description = new TextSyndicationContent("This is a sample that illustrates how to expose a feed using ATOM with WCF");
    
    Dim feed As New SyndicationFeed("My Blog Feed", "This is a test feed", New Uri("http://SomeURI"), "FeedOneID", new DateTimeOffset(DateTime.Now))
    feed.Authors.Add(New SyndicationPerson("someone@microsoft.com"))
    feed.Categories.Add(New SyndicationCategory("How To Sample Code"))
    feed.Description = New TextSyndicationContent("This is a sample that illustrates how to expose a feed imports ATOM with WCF")
    
  4. 複数の SyndicationItem オブジェクトを作成します。

    SyndicationItem item1 = new SyndicationItem(
        "Item One",
        "This is the content for item one",
        new Uri("http://localhost/Content/One"),
        "ItemOneID",
        DateTime.Now);
    
    SyndicationItem item2 = new SyndicationItem(
        "Item Two",
        "This is the content for item two",
        new Uri("http://localhost/Content/Two"),
        "ItemTwoID",
        DateTime.Now);
    
    SyndicationItem item3 = new SyndicationItem(
        "Item Three",
        "This is the content for item three",
        new Uri("http://localhost/Content/three"),
        "ItemThreeID",
        DateTime.Now);
    
    Dim item1 As New SyndicationItem( _
        "Item One", _
        "This is the content for item one", _
        New Uri("http://localhost/Content/One"), _
        "ItemOneID", _
        DateTime.Now)
    
    Dim item2 As New SyndicationItem( _
        "Item Two", _
        "This is the content for item two", _
        New Uri("http://localhost/Content/Two"), _
        "ItemTwoID", _
        DateTime.Now)
    
    Dim item3 As New SyndicationItem( _
        "Item Three", _
        "This is the content for item three", _
        New Uri("http://localhost/Content/three"), _
        "ItemThreeID", _
        DateTime.Now)
    
  5. SyndicationItem オブジェクトをフィードに追加します。

    List<SyndicationItem> items = new List<SyndicationItem>();
    
    items.Add(item1);
    items.Add(item2);
    items.Add(item3);
    
    feed.Items = items;
    
    Dim items As New List(Of SyndicationItem)()
    
    items.Add(item1)
    items.Add(item2)
    items.Add(item3)
    
    feed.Items = items
    
  6. フィードを返します。

    return new Atom10FeedFormatter(feed);
    
    Return New Atom10FeedFormatter(feed)
    

サービスをホストするには

  1. WebServiceHost オブジェクトを作成します。

    Uri baseAddress = new Uri("http://localhost:8000/BlogService/");
    WebServiceHost svcHost = new WebServiceHost(typeof(BlogService), baseAddress);
    
    Dim baseAddress As New Uri("http://localhost:8000/BlogService/")
    Dim svcHost As New WebServiceHost(GetType(BlogService), baseAddress)
    
  2. サービス ホストを開き、サービスからフィードを読み込み、フィードを表示してから、ユーザーが Enter キーを押すのを待ちます。

    svcHost.Open();
    Console.WriteLine("Service is running");
    
    XmlReader reader = XmlReader.Create("http://localhost:8000/BlogService/GetBlog");
    SyndicationFeed feed = SyndicationFeed.Load(reader);
    Console.WriteLine(feed.Title.Text);
    Console.WriteLine("Items:");
    foreach (SyndicationItem item in feed.Items)
    {
        Console.WriteLine("Title: {0}", item.Title.Text);
        Console.WriteLine("Content: {0}", ((TextSyndicationContent)item.Content).Text);
    }
    Console.WriteLine("Press <ENTER> to quit...");
    Console.ReadLine();
    svcHost.Close();
    
    svcHost.Open()
    Console.WriteLine("Service is running")
    
    Dim reader As XmlReader = XmlReader.Create("http://localhost:8000/BlogService/GetBlog")
    Dim feed As SyndicationFeed = SyndicationFeed.Load(reader)
    Console.WriteLine(feed.Title.Text)
    Console.WriteLine("Items:")
    
    For Each item As SyndicationItem In feed.Items
        Console.WriteLine("Title: {0}", item.Title.Text)
        Console.WriteLine("Content: {0}", item.Title.Text)
    Next
    
    Console.WriteLine("Press <ENTER> to quit...")
    Console.ReadLine()
    svcHost.Close()
    

HTTP GET で GetBlog() を呼び出すには

  1. Web ブラウザーで、次の URL を参照します: http://localhost:8000/BlogService/GetBlog

    この URL には、サービスのベース アドレス (http://localhost:8000/BlogService)、エンドポイントの相対アドレス、および呼び出すサービス操作が含まれます。

コードから GetBlog() を呼び出すには

  1. ベース アドレスと呼び出すメソッドを使用して XmlReader を作成します。

    XmlReader reader = XmlReader.Create("http://localhost:8000/BlogService/GetBlog");
    
    Dim serviceAddress As New Uri("http://localhost:8000/BlogService/GetBlog")
    
  2. 静的な Load(XmlReader) メソッドを呼び出し、作成した XmlReader を渡します。

    SyndicationFeed feed = SyndicationFeed.Load(reader);
    
    Dim feed As SyndicationFeed = SyndicationFeed.Load(serviceAddress)
    

    これにより、サービス操作が呼び出され、サービス操作から返されたフォーマッタが新しい SyndicationFeed に設定されます。

  3. フィード オブジェクトにアクセスします。

    Console.WriteLine(feed.Title.Text);
    Console.WriteLine("Items:");
    foreach (SyndicationItem item in feed.Items)
    {
        Console.WriteLine("Title: {0}", item.Title.Text);
        Console.WriteLine("Summary: {0}", ((TextSyndicationContent)item.Summary).Text);
    }
    
    Console.WriteLine(feed.Title.Text)
    Console.WriteLine("Items:")
    For Each item As SyndicationItem In feed.Items
        Console.WriteLine("Title: {0}", item.Title.Text)
        Console.WriteLine("Summary: {0}", item.Summary.Text)
    Next
    

この例の完全なコードの一覧を以下に示します。

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ServiceModel;
using System.Xml;
using System.ServiceModel.Description;
using System.ServiceModel.Syndication;
using System.ServiceModel.Channels;
using System.ServiceModel.Web;

namespace Service
{
    [ServiceContract]
    public interface IBlog
    {
        [OperationContract]
        [WebGet]
        Atom10FeedFormatter GetBlog();
    }

    public class BlogService : IBlog
    {
        public Atom10FeedFormatter GetBlog()
        {
            SyndicationFeed feed = new SyndicationFeed("My Blog Feed", "This is a test feed", new Uri("http://SomeURI"), "FeedOneID", new DateTimeOffset(DateTime.Now));
            feed.Authors.Add(new SyndicationPerson("someone@microsoft.com"));
            feed.Categories.Add(new SyndicationCategory("How To Sample Code"));
            feed.Description = new TextSyndicationContent("This is a sample that illustrates how to expose a feed using ATOM with WCF");

            SyndicationItem item1 = new SyndicationItem(
                "Item One",
                "This is the content for item one",
                new Uri("http://localhost/Content/One"),
                "ItemOneID",
                DateTime.Now);

            SyndicationItem item2 = new SyndicationItem(
                "Item Two",
                "This is the content for item two",
                new Uri("http://localhost/Content/Two"),
                "ItemTwoID",
                DateTime.Now);

            SyndicationItem item3 = new SyndicationItem(
                "Item Three",
                "This is the content for item three",
                new Uri("http://localhost/Content/three"),
                "ItemThreeID",
                DateTime.Now);
            List<SyndicationItem> items = new List<SyndicationItem>();

            items.Add(item1);
            items.Add(item2);
            items.Add(item3);

            feed.Items = items;
            return new Atom10FeedFormatter(feed);
        }
    }

    public class Host
    {
        static void Main(string[] args)
        {
            Uri baseAddress = new Uri("http://localhost:8000/BlogService/");
            WebServiceHost svcHost = new WebServiceHost(typeof(BlogService), baseAddress);
            try
            {
                svcHost.Open();
                Console.WriteLine("Service is running");

                XmlReader reader = XmlReader.Create("http://localhost:8000/BlogService/GetBlog");
                SyndicationFeed feed = SyndicationFeed.Load(reader);
                Console.WriteLine(feed.Title.Text);
                Console.WriteLine("Items:");
                foreach (SyndicationItem item in feed.Items)
                {
                    Console.WriteLine("Title: {0}", item.Title.Text);
                    Console.WriteLine("Content: {0}", ((TextSyndicationContent)item.Content).Text);
                }
                Console.WriteLine("Press <ENTER> to quit...");
                Console.ReadLine();
                svcHost.Close();
            }
            catch (CommunicationException ce)
            {
                Console.WriteLine("An exception occurred: {0}", ce.Message);
                svcHost.Abort();
            }
        }
    }
}
Imports System.Xml
Imports System.Collections.Generic
Imports System.Collections.ObjectModel
Imports System.ServiceModel
Imports System.ServiceModel.Description
Imports System.ServiceModel.Syndication
Imports System.ServiceModel.Channels
Imports System.ServiceModel.Web

<ServiceContract()> _
Public Interface IBlog
    <OperationContract()> _
    <WebGet> _
    Function GetBlog() As Atom10FeedFormatter
End Interface

Public Class BlogService
    Implements IBlog
    Public Function GetBlog() As Atom10FeedFormatter Implements IBlog.GetBlog
        Dim feed As New SyndicationFeed("My Blog Feed", "This is a test feed", New Uri("http://SomeURI"), "FeedOneID", new DateTimeOffset(DateTime.Now))
        feed.Authors.Add(New SyndicationPerson("someone@microsoft.com"))
        feed.Categories.Add(New SyndicationCategory("How To Sample Code"))
        feed.Description = New TextSyndicationContent("This is a sample that illustrates how to expose a feed imports ATOM with WCF")

        Dim item1 As New SyndicationItem( _
            "Item One", _
            "This is the content for item one", _
            New Uri("http://localhost/Content/One"), _
            "ItemOneID", _
            DateTime.Now)

        Dim item2 As New SyndicationItem( _
            "Item Two", _
            "This is the content for item two", _
            New Uri("http://localhost/Content/Two"), _
            "ItemTwoID", _
            DateTime.Now)

        Dim item3 As New SyndicationItem( _
            "Item Three", _
            "This is the content for item three", _
            New Uri("http://localhost/Content/three"), _
            "ItemThreeID", _
            DateTime.Now)
        Dim items As New List(Of SyndicationItem)()

        items.Add(item1)
        items.Add(item2)
        items.Add(item3)

        feed.Items = items
        Return New Atom10FeedFormatter(feed)
    End Function
End Class

Module Program

    Sub Main()
        Dim baseAddress As New Uri("http://localhost:8000/BlogService/")
        Dim svcHost As New WebServiceHost(GetType(BlogService), baseAddress)
        Try
            svcHost.AddServiceEndpoint(GetType(IBlog), New WebHttpBinding(), "")
            svcHost.Open()
            Console.WriteLine("Service is running")

            Dim reader As XmlReader = XmlReader.Create("http://localhost:8000/BlogService/GetBlog")
            Dim feed As SyndicationFeed = SyndicationFeed.Load(reader)
            Console.WriteLine(feed.Title.Text)
            Console.WriteLine("Items:")

            For Each item As SyndicationItem In feed.Items
                Console.WriteLine("Title: {0}", item.Title.Text)
                Console.WriteLine("Content: {0}", item.Title.Text)
            Next

            Console.WriteLine("Press <ENTER> to quit...")
            Console.ReadLine()
            svcHost.Close()

        Catch ce As CommunicationException
            Console.WriteLine("An exception occurred: {0}", ce.Message)
            svcHost.Abort()
        End Try
    End Sub

End Module

コードのコンパイル

上記のコードのコンパイル時には、System.ServiceModel.dll と System.ServiceModel.Web.dll が参照されます。

関連項目