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