WCF目前使用越来越多了,但根据不同的.NET版本,会不同的使用方式。
首先,我们在.NET(3.0/3.5)开发WCF的使用示例。
服务接口-》服务-》客户端。 也就是最常用的开发方式,也是最多的开发方式。
1.服务接口:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.ServiceModel; namespace WCF.IServiceAPI { /// <summary> /// 服务接口 /// </summary> [ServiceContract(Namespace= "http://yuhao.com")] public interface IProduct { [OperationContract] IEnumerable<Product> GetAll(); [OperationContract] Product Get(string id); [OperationContract] void Add(Product product); [OperationContract] void Delete(string id); [OperationContract] void Update(Product product); } }
数据成员:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Runtime.Serialization; namespace WCF.IServiceAPI { /// <summary> /// 实体类 yuhao 2013-2-22 Create /// </summary> [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配置:
<!--手工写WCF配置说明 开始--> <system.serviceModel> <services> <!--Name 指的是你提供服务的类名 带命名空间 behaviorConfiguration 要暴露的元数据 一般是指要提供的行为 和下面的behaviors--> <service name="Wcf.Server.ProductService" behaviorConfiguration="ProductSevice"> <host><!--Host 是配置的主机--> <baseAddresses> <add baseAddress="http://127.0.0.1:1808/ProcutService"/> <!--这里是提供的服务地址--> </baseAddresses> </host> <endpoint address="" binding="wsHttpBinding" contract="WCF.IServiceAPI.IProduct"><!--endpoint 总结点 表示的是服务的绑定的契约和服务协议--><!--adress为空 表示使用上面的基地址--> </endpoint> <!--元数据交换的endpoint--> <!--注:address是mex,它会和host/baseAddresses节点中的baseAddress做拼接,即提供元数据交换的地址为:http://127.0.0.1:1808/ProcutService/mex--> <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> </service> </services> <behaviors> <serviceBehaviors> <behavior name="ProductSevice"><!--这里就是Service中绑定--> <serviceMetadata httpGetEnabled="true"/><!--暴露元数据--> <serviceDebug includeExceptionDetailInFaults="true"/><!--是否对错误的元数据进行Debug--> </behavior> </serviceBehaviors> </behaviors> </system.serviceModel> <!--结束-->
服务端-实现服务类:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using WCF.IServiceAPI; namespace Wcf.Server { public class ProductService:IProduct { private static IList<Product> Products = new List<Product>() { new Product{Id="1",ProductName="Iphone4s", Price="3700"}, new Product{Id="2",ProductName="IPad3",Price="3200"} }; #region IProduct 成员 public IEnumerable<Product> GetAll() { return Products; } public Product Get(string id) { Product product = Products.FirstOrDefault(e => e.Id == id); if (null != product) { return product; } return null; } public void Add(Product product) { Products.Add(product); } public void Delete(string id) { Product product = this.Get(id); if (null != product) { Products.Remove(product); } } public void Update(Product product) { this.Delete(product.Id); Products.Add(product); } #endregion } }
服务端-服务开启类:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.ServiceModel; namespace Server { class Program { static void Main(string[] args) { using (ServiceHost host = new ServiceHost(typeof(Wcf.Server.ProductService))) { host.Open(); Console.WriteLine("服务已经开启"); Console.ReadKey(); } } } }
3.客户端调用:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using ProductService; public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { ProductClient client = new ProductClient(); Array.ForEach(client.GetAll().ToArray(), s => Response.Write(s.ProductName)); } }
至于客户端Config是调用服务类的时候,自动生成的无需手工配置
注意,在编译服务端的时候,请使用管理员身份运行VS。
WCF三个最最重要的就是ABC:
第一: "A" 是地址,就是告诉别人我WCF在何处。
第二: "B"是绑定,就是告诉别人应该走什么路才能过来。
第三: "C"是契约:就是告诉别人我WCF这里有哪些东西。
常用的协议三种绑定:
第一:wsHttpBinding, 这个binding可以认为是webservice的加强版WSE,设计的目的就是用于异构系统的交互(比如java)。
第二:netTcpBinding, 这个binding可以认为是remoting的加强版,设计的目的就是用于不同机器的.net 程序交互,
第三: netMsmqBinding, 这个binding可以认为是msmq的加强版本,设计目的就是脱机环境下不同机器的.net程序交互,确保信息不丢失。
好了,文笔不好,大家谅解下,下一篇,我将讲解下载.NET(3.0/3.5)是使用WCF开发REST。
下载示例代码:WcfDemo(.net3.5).zip