WCF4.0–-RESTful WCF Services(1)(入門)


WCFはRESTの開発をよくサポートしているが、RESTfulのサービスは通常アーキテクチャの面で考慮されている.それは生まれつきとても良いプラットフォームをまたいで言語の集積能力を持っているため、ほとんどの言語とネットプラットフォームはHTTP要求をサポートして、複雑なクライアントエージェントを実現する必要はなくて、複雑なデータ通信方式を使う必要はなくて、私たちのサービスをいかなる必要とする人に暴露することができて、彼がVB、Ruby、JavaScriptを使っても、甚だしきに至ってはHTML FORMを使っても、または、ブラウザのアドレスバーに直接入力します. 
WCFでは、WebGetAttribute、WebInvokeAttribute(GET/PUT/POST/DELETE)、UriTemplateによりRESTのサービスの呼び出しを定義し、WebMessageFormat(Xml/Json)によりメッセージングのフォーマットを定義する.
using System;  
using System.Collections.Generic;  
using System.Runtime.Serialization;  
using System.ServiceModel;  
using System.ServiceModel.Web;  
  
namespace WcfRESTfulSvc1  
{  
    [ServiceContract]  
    public interface ITaskService  
    {  
        [OperationContract]  
        [WebGet(UriTemplate="Tasks/Xml", ResponseFormat=WebMessageFormat.Xml)]  
        List<Task> GetTasksXml();  
  
        [OperationContract]  
        [WebGet(UriTemplate = "Tasks/Json", ResponseFormat = WebMessageFormat.Json)]  
        List<Task> GetTasksJson();  
  
        [OperationContract]  
        [WebInvoke(UriTemplate="Task/{title}", Method="GET", ResponseFormat=WebMessageFormat.Json)]  
        Task GetTasksByTitle(string title);  
    }  
  
  
    [DataContract]  
    public class Task  
    {  
        [DataMember]  
        public string Title { get; set; }  
        [DataMember]  
        public string Detail { get; set; }  
        [DataMember]  
        public DateTime CreatedDate { get; set; }  
    }  
}  
using System;
using System.Collections.Generic;
using System.Linq;

namespace WcfRESTfulSvc1
{
    public class TaskService : ITaskService
    {
        public List<Task> GetTasksXml()
        {
            return GetData();
        }

        public List<Task> GetTasksJson()
        {
            return GetData();
        }

        public Task GetTasksByTitle(string title)
        {
            return GetData().Where(t => t.Title == title).FirstOrDefault();
        }

        private static List<Task> GetData()
        {
            return new List<Task>
            {
                new Task { Title="Task1", Detail="Do Something 1", CreatedDate=DateTime.Now },
                new Task { Title="Task2", Detail="Do Something 2", CreatedDate=DateTime.Now },
                new Task { Title="Task3", Detail="Do Something 3", CreatedDate=DateTime.Now },
                new Task { Title="Task4", Detail="Do Something 4", CreatedDate=DateTime.Now },
                new Task { Title="Task5", Detail="Do Something 5", CreatedDate=DateTime.Now },
            };
        }
    }
}

WCF 4.0で作成されたWCFサービスアプリケーションによるRESTサービスのリリースは簡単で、svcのMarkupにFactoryを追加するだけです.
<%@ ServiceHost Language="C#"Debug="true"Service="WcfRESTfulSvc1.TaskService"CodeBehind="TaskService.svc.cs"
Factory="System.ServiceModel.Activation.WebServiceHostFactory"
%>
BTW:でも、これでWCFのMetadataはアクセスできなくなり、つまりsvcのwsdlにアクセスできなくなります.
Debugを使用してデバッグを開始するか、IISにパブリッシュします.
IISにパブリッシュするには、アプリケーションプールがaspに変更されることに注意してください.Net 4.0,そうでないと名詞が見つからないエラーOKを報告し,ブラウザに入力するhttp://localhost:2571/TaskService.svc/Tasks/Xml結果が得られます.
<ArrayOfTask xmlns="http://schemas.datacontract.org/2004/07/WcfRESTfulSvc1" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
  <Task>
    <CreatedDate>2011-03-09T21:51:13.3376004+08:00</CreatedDate>
    <Detail>Do Something 1</Detail>
    <Title>Task1</Title>
  </Task>
  <Task>
    <CreatedDate>2011-03-09T21:51:13.3376004+08:00</CreatedDate>
    <Detail>Do Something 2</Detail>
    <Title>Task2</Title>
  </Task>
  <Task>
    <CreatedDate>2011-03-09T21:51:13.3376004+08:00</CreatedDate>
    <Detail>Do Something 3</Detail>
    <Title>Task3</Title>
  </Task>
  <Task>
    <CreatedDate>2011-03-09T21:51:13.3376004+08:00</CreatedDate>
    <Detail>Do Something 4</Detail>
    <Title>Task4</Title>
  </Task>
  <Task>
    <CreatedDate>2011-03-09T21:51:13.3376004+08:00</CreatedDate>
    <Detail>Do Something 5</Detail>
    <Title>Task5</Title>
  </Task>
</ArrayOfTask>

クライアントの呼び出しはSystemを利用する.Net.WebClientも簡単です.
var client = new WebClient(); this.txtResponse.Text = client.DownloadString(url);//このURLをお願いする
Jsonの戻り結果:[{"CreatedDate":"//Date(1299687080328+0800)//],"Detail":"Do Something 1","Title":"Task 1"},{"CreatedDate":"//Date(1299687080328+0800)//","Detail":"Do Something 2","Title":"Task 2"},{"CreatedDate":"//Date(1299687080328+ 0800)////////////////////////////////////////////////////////////////////////////////////////////////////////////////,『Detail』:『Do Something 3』,『Title』:『Task 3』},{『CreatedDate』:「//Date(1299687080328+0800)/」「Detail」:"Do Something 4","Title":"Task4"},{"CreatedDate":"//Date(1299687080328+0800)//","Detail":"Do Something 5","Title":"Task5"}]
jQueryを使用してこのサービスを呼び出す方法を見てみましょう.
<mce:script type="text/javascript" language="JavaScript"><!--
    $(document).ready(function () {
        $("#btnGet").click(function () {
            var url = $("#txtUrl").val();
            $.get(url, function (data) {
                for (var i = 0; i < data.length; i++)
                    $("#divResponse").append("<li>" +
                    data[i].Title + " - " +
                    data[i].Detail + "</li>");
            });
        });
    });
// --></mce:script>