http://www.cnblogs.com/KeithWang/archive/2012/02/14/2351826.htmlhtml
http://blog.csdn.net/qq_26054303/article/details/48655985web
http://www.cnblogs.com/LNCLSH/p/3781572.html網絡
共同窗習了前面一些概念,終於開始正題了哈。RESTful的Web Service調用直觀,返回的內容容易解析。這裏先會描述一個簡單的場景--Web Service提供一個方法來搜索我的信息,傳入人名,返回完整我的信息。
下面咱們一步步用WCF實現一個RESTful的Web Service。在這以後分別描述用普通Console程序host在本地,以及用IIS發佈到網絡。學習
1. Contractspa
namespace WcfRESTful
{
[ServiceContract]
public interface IPersonRetriever
{
[OperationContract]
[WebGet(UriTemplate = "Persons/{name}", ResponseFormat = WebMessageFormat.Json)]
Person GetPerson(string name);
}
[DataContract]
public class Person
{
[DataMember]
public string Name { get; set; }
[DataMember]
public int Age { get; set; }
[DataMember]
public DateTime Birthday { get; set; }
}
}
這裏須要注意的是在方法GetPerson()上面的WebGetAttribute:
1.1 WebGetAttribute定義了該方法的訪問方式爲RESTful的Get(關於RESTful能夠參考本小博中關於REST介紹的文章)。
1.2 UriTemplet描述了URL匹配的格式,當格式匹配時,{name}位置的字符串會被對應傳入爲方法參數。
1.3 ResponseFormat指定了返回的數據格式,可選項爲JSON和XML。.net
2. Contract實現debug
namespace WcfRESTful
{
public class PersonRetriever : IPersonRetriever
{
public Person GetPerson(string name)
{
WebOperationContext.Current.OutgoingResponse.ContentType = "text/plain";
return new Person { Name = name, Age = 22, Birthday = DateTime.Now };
}
}
}
這個實現裏面,咱們簡單的返回一個用傳入名參數爲name的Person實例。這裏補充一點:若是ContectType是"Text",若是返回結果串包含特別字符(好比轉義,雙引號,XML文件片斷等),有些狀況會在IE中解析不正常,形成字段缺失,目前沒有找到相關資料說明IE解析規則。爲了方便和謹慎起見,直接用"text/plain"。code
3. 在Console中Host Serviceorm
在第1,2步的基礎上,咱們開始在console中host這個service。htm
namespace WcfRESTful
{
class Program
{
static void Main(string[] args)
{
Uri baseAddress = new Uri("http://127.0.0.1:9998/PersonRetriever");
using (ServiceHost host = new ServiceHost(typeof(PersonRetriever), baseAddress))
{
WebHttpBinding binding = new WebHttpBinding();
ServiceEndpoint endpoint = host.AddServiceEndpoint(typeof(IPersonRetriever), binding, baseAddress);
WebHttpBehavior httpBehavior = new WebHttpBehavior();
endpoint.Behaviors.Add(httpBehavior);
host.Opened += delegate
{
Console.WriteLine("Hosted successfully.");
};
host.Open();
Console.ReadLine();
}
}
}
}
讓後咱們經過URL:http://127.0.0.1:9998/PersonRetriever/Persons/Tom 就能夠訪問該Service了,其中"Tom"是須要查詢的人名。在IE中輸入該URL,回車以後的結果以下圖:
4. 在IIS中Host Web Service
4.1新建一個WCF Service(或者Web Service依.Net Framework版本不一樣而定)工程,把第1,2步的Contract和實現Copy到App_Code文件夾下面。
4.2修改Service.svc - 注意,Factory="System.ServiceModel.Activation.WebServiceHostFactory"必須添加才能夠直接在IE查看結果,可是Matedata將被屏蔽不能顯示。
<%@ ServiceHost Language="C#" Debug="true" Service="WcfRESTful.PersonRetriever" CodeBehind="~/App_Code/PersonRetriever.cs" Factory="System.ServiceModel.Activation.WebServiceHostFactory"%>
4.3添加Endpoint到Web.config
<system.serviceModel>
<services>
<service name="WcfRESTful.PersonRetriever" behaviorConfiguration="ServiceBehavior">
<endpoint binding="webHttpBinding" contract="WcfRESTful.IPersonRetriever"/>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="ServiceBehavior">
<!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
<serviceMetadata httpGetEnabled="true"/>
<!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information -->
<serviceDebug includeExceptionDetailInFaults="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
4.4添加工程目錄到IIS虛擬路徑,命名爲WCFTest。
以上4.1-4.4的全部步驟都完成了,咱們經過URL:http://16X.19X.18X.6X/wcftest/Service.svc/Persons/Tom 同樣能夠獲得上面的結果{"Age":22,"Birthday":"\/Date(1329226087212-0500)\/","Name":"Tom"}。
這裏須要補充一點,在4.1步驟,咱們新建一個Web Service工程,僅僅是爲了少寫一些Web.Config的配置(會默認有system.web,complier等配置信息),其實咱們徹底能夠新建App_Code文件夾,把Contact和Contract實現拷入該文件夾,而後在外層手工新建Service.svc,Web.config並寫入相應配內容,同樣能夠成功部署和使用。
5. 總結RESTful Web Service用更簡單通用的協議(HTTP,少了SOAP這一道封裝和解析),更直接的結果,讓人眼前一亮,在資源不須要交互邏輯和複雜結構的狀況下仍是不錯的選擇