上面我介紹了在.NET(3.0/3.5)開發WCF的使用示例。
這篇,我将講解Rest 這個炙手可熱的新的開發方式,至于rest 是什麼,請大家百度下。
我們還是以下面的方式做示例:
服務接口-》服務-》用戶端
1.服務接口:資料接口
using System.ServiceModel;
using System.ServiceModel.Web; //這裡就是REST 要關鍵引用的類
using System.Runtime.Serialization;
namespace Wcf.IProductService
{
[ServiceContract]
public interface IProduct
{
//REST 四個 GET POST PUT DELETE
[OperationContract] //注意.NET3.5必須要帶這個 4.0 開始就可以取消了
[WebGet(UriTemplate = "all", ResponseFormat = WebMessageFormat.Xml)]
List<Product> GetAll();
/*IEnumerable<Product> GetAll();
在.NET3.5不可以 4.0就可以 很郁悶 找了2天 問題依舊
後來把 IEnumerable改成List 問題解決
原因.NET4.0 對IEnumerable增加了新特性
*/
[OperationContract]
[WebGet(UriTemplate = "{id}")]
Product Get(string id);
//添加 其中路徑為/
[OperationContract]
[WebInvoke(UriTemplate = "/", Method = "POST")]
void Create(Product product);
//更新
[OperationContract]
[WebInvoke(UriTemplate = "/", Method = "PUT")]
void Update(Product product);
//删除
[OperationContract]
[WebInvoke(UriTemplate = "{id}", Method = "DELETE")]
void Delete(string id);
}
}
資料成員:
using System.Runtime.Serialization; //序列化
namespace Wcf.IProductService
{
[DataContract(Namespace = "http://yuhao.com")]
public class Product
{
[DataMember]
public string Id { get; set; }
[DataMember]
public string ProductName { get; set; }
[DataMember]
public string Price { get; set; }
}
}
2.服務:config配置
<system.serviceModel>
<!--注意這裡傳統的WCF差別-->
<services>
<service name="Server.ProductService"> <!--這裡隻有服務名稱 沒有行為-->
<endpoint address="http://127.0.0.1:1808/ProductService"
binding="webHttpBinding"
contract="Wcf.IProductService.IProduct" />
<!--Address(位址) 提高通路位址 可以自己設定-->
<!--Binding(綁定) 提供通路的模式 -->
<!--Contract(契約) 表示的是提高的接口 帶命名空間-->
<!--大家看到了沒有 多簡單沒有 那個複雜的中繼資料-->
</service>
</services>
</system.serviceModel>
實作服務類
using Wcf.IProductService;
using System.ServiceModel.Web;
namespace Server
{
public class ProductService:IProduct
{
public static List<Product> products = new List<Product>()
{
new Product{Id="1",ProductName="Iphone4s",Price="3788"},
new Product{Id="2",ProductName="Ipad3",Price="3288"}
};
#region IProduct 成員
//public IEnumerable<Product> GetAll() .net 3.5 不支援 害我調試半天
public List<Product> GetAll()
{
return products;
}
public Product Get(string id)
{
Product product = products.FirstOrDefault(p => p.Id == id);
if (null == product)
{
return null;
}
return product;
}
public void Create(Product product)
{
products.Add(product);
}
public void Update(Product product)
{
this.Delete(product.Id);
products.Add(product);
}
public void Delete(string id)
{
Product product = this.Get(id);
if (null != product)
{
products.Remove(product);
}
}
#endregion
}
}
開啟服務類 :
using System.ServiceModel;
using System.ServiceModel.Web;//這個類是關鍵
using Wcf.IProductService;
namespace Server
{
class Program
{
static void Main(string[] args)
{
using (WebServiceHost host = new WebServiceHost(typeof(ProductService)))
{
host.Open();
Console.WriteLine("服務已啟動");
Console.Read();
}
}
}
}
3.用戶端:config配置
<system.serviceModel>
<behaviors>
<endpointBehaviors>
<behavior name="webBehavior">
<webHttp/>
</behavior>
</endpointBehaviors>
</behaviors>
<client>
<endpoint name="Server.ProductService" address="http://127.0.0.1:1808/ProductService" behaviorConfiguration="webBehavior" binding="webHttpBinding" contract="Wcf.IProductService.IProduct"/>
</client>
</system.serviceModel>
用戶端調用
ChannelFactory<IProduct> ChannelFactory = new ChannelFactory<IProduct>("Server.ProductService");
IProduct proxy = ChannelFactory.CreateChannel();
//Response.Write(proxy.Get("1").ProductName);
Array.ForEach<Product>(proxy.GetAll().ToArray(), product => Response.Write(product.ProductName));
好了,代碼到此就結束了,大家發現沒有這個比傳統的SOAP代碼省多了 而且還很簡單 太棒了!
大家在開發Rest的時候,盡量多注意.net版本,我就因為一個傳回數組的問題,折騰2天!
下一篇,我将講解.net 4.0 開發WCF 的開發方式 和以往更不同哦!
示例代碼:WcfDemo(.net3.5)REST.zip