(轉)http://www.cnblogs.com/VinC/archive/2011/02/24/1964049.html
本章目的: 用Wcf建立可以上Android可以訪問的資料服務, 資料轉送格式採用比較適合於移動互連網傳輸的Json格式.
服務的開發流程我們按照 服務契約(ServiceContract), 服務實現(Service), 實體物件模型(Model) 及服務發布的流程來介紹.
由於自己對Http請求的連結認識的比較淺,對於有些問題沒法做出清楚明了的解釋, Android訪問WCF這篇文章我會貼出來代碼, 讓後說明一下關注的地方, 不做深入研究.
一. 服務契約(Contract)
[ServiceContract]<br /> public interface IAccountJsonService<br /> {<br /> [OperationContract(Name = "GetAccountDataJson")]<br /> [WebGet(RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, UriTemplate = "GetAccountData", BodyStyle = WebMessageBodyStyle.Bare)]<br /> List<Account> GetAccountData();</p><p> [OperationContract(Name = "SendMessageJson")]<br /> [WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json, UriTemplate = "SendMessage/{Message}", BodyStyle = WebMessageBodyStyle.Bare)]<br /> string SendMessage(string Message);<br /> }<br />
此契約定義了兩個方法, GetAccountData(擷取Account資料列表, 方法不帶參數), SendMessage, 擷取從用戶端傳過來的資料, 並返回;
1. 這裡面注意WebInvoke(SendMessage方法)這個Attribute, Method代表了Http的存取方法, 我們這是從伺服器擷取資料,是請求資料, 所以用GET, 這個也可以用另外一個Attribute來替代-WebGet(GetAccountData方法);
2. 我們要給用戶端返回Json資料,我們只需在WebInvoke or WebGet Attribute中指定ResponseFormat的格式即可, 這個從名字命名就可以看出來是制定返回的資料格式的.
3. 要注意UriTemplate屬性, 這個是指定我們請求時的方法路徑, 後面給出樣本.
二. 服務實現(Service)
public class AccountService : IAccountJsonService<br />{<br /> public List<Account> GetAccountData()<br /> {<br /> return MockAccount.AccountList;<br /> }<br /> public string SendMessage(string Message)<br /> {<br /> return " Message:" + Message;<br /> }<br />}<br />
此處只是實現了IAccountJsonService介面.
三. 實體物件模型&類比資料實體類定義:
[DataContract]<br /> public class Account<br /> {<br /> [DataMember]<br /> public string Name { get; set; }<br /> [DataMember]<br /> public int Age { get; set; }<br /> [DataMember]<br /> public string Address { get; set; }<br /> [DataMember]<br /> public DateTime Birthday { get; set; }<br /> }<br />
類比資料:
public class MockAccount<br /> {<br /> public static List<Account> AccountList<br /> {<br /> get<br /> {<br /> var list = new List<Account>();<br /> list.Add(new Account { Name = "Bill Gates", Address = "YouYi East Road", Age = 56, Birthday = DateTime.Now });<br /> list.Add(new Account { Name = "Steve Paul Jobs", Address = "YouYi West Road", Age = 57, Birthday = DateTime.Now });<br /> list.Add(new Account { Name = "John D. Rockefeller", Address = "YouYi North Road", Age = 65, Birthday = DateTime.Now });<br /> return list;<br /> }<br /> }<br /> }<br />
類比資料返回一個Account的列表, 含有三條類比資料, Birthday用DateTime.Now可是隨時查看資料是不是最新產生的.
四. 服務發布
在這個例子裡面, 我們的服務採用Console的發布形式, 如果採用IIS發布, 只要參考WCF的服務配置資訊, 在IIS環境下配置就OK了.
WCF配置資訊
<system.serviceModel><br /> <behaviors><br /> <serviceBehaviors><br /> <behavior name=""><br /> <serviceMetadata httpGetUrl="mex" httpGetEnabled="true"/><br /> <serviceDebug httpHelpPageEnabled="true" includeExceptionDetailInFaults="true"/><br /> </behavior><br /> </serviceBehaviors><br /> <endpointBehaviors><br /> <behavior name="WebHttpBindingBehavior"><br /> <webHttp/><br /> </behavior><br /> </endpointBehaviors><br /> </behaviors></p><p> <services><br /> <service name="Hosting.AccountService"><br /> <endpoint address="xml" binding="webHttpBinding" contract="Hosting.IAccountXmlService" behaviorConfiguration="WebHttpBindingBehavior"/><br /> <!--<endpoint address="json" binding="webHttpBinding" contract="Hosting.IAccountJsonService" behaviorConfiguration="WebHttpBindingBehavior"/>--><br /> <host><br /> <baseAddresses><br /> <add baseAddress="http://127.0.0.1:82/AccountService"/><br /> </baseAddresses><br /> </host><br /> </service><br /> </services><br /> </system.serviceModel></p><p>
控制台進行服務的託管發布
class Program<br /> {<br /> static void Main(string[] args)<br /> {<br /> using (ServiceHost host = new ServiceHost(typeof(AccountService)))<br /> {<br /> host.Open();<br /> Console.WriteLine("AccountService Address:");<br /> foreach (var endpoint in host.Description.Endpoints)<br /> {<br /> Console.WriteLine(endpoint.Address.ToString());<br /> }<br /> Console.WriteLine("AccountService Started,Press any key to stop service...");<br /> Console.ReadKey();<br /> host.Close();<br /> }<br /> }<br /> }<br />
下篇將介紹Android如何訪問我們編寫的服務.