本文是一个wcf的入门例子,没有想到什么更好的而且简单的例子。所以功能实现的只是加减法和阶乘,目的只是为了引导像我一样的菜鸟的人,开始探索wcf。
下面进入正题:
首先创建服务接口,或者说contract
[ServiceContract] public interface ICalculateService { [OperationContract] int Add(int i, int j); [OperationContract] int Minus(int i, int j); [OperationContract] int Factorial(int i); [OperationContract] int FactorialMyNumber(Number n); }
该接口定义了加减阶乘三个操作,第四个操作稍后再说。
对于contract来说需要为其指定[ServiceContract]标记其为wcf要发布的服务,并且其中每一个函数也要标记[OperatioContract],没有标记不会被服务调用者发现。
然后实现该接口
public class CalculateService : ICalculateService { public int Add(int i, int j) { return i + j; } public int Minus(int i, int j) { return i - j; } public int Factorial(int i) { return f(i); } public int FactorialMyNumber(Number n) { return f(n.Num); } private int f(int n) { if (n < 0) throw new NotSupportedException("Number smaller than 0 exist but not supported"); if (n == 0 || n == 1) return 1; else
return n*f(n-1); } }
wcf服务实质上client调用,然后在服务端运行,这种调用就意味着数据传输,包括调用信息的传输,还包括参数和返回值,而参数返回值必须是可识别的,或者说可以序列化的。.net基本类型默认都是可以识别的,如果是自定义的类就需要做些额外工作。这就是[DataContract]
[DataContract] public class Number { public Number(int num) { Num = num; } [DataMember] public int Num{get;set;} }
对于Number需要指定[DataContract]属性,对于要发布的成员变量要标记[DataMember],而且是public的,这样就可以传输了。
在上面服务接口第四个就是通过参数把Number传进来.
Contract 分为ServiceContract和DataContract,一个是行为,一个是数据.
现在服务已经定义完毕,然后就是发布这个服务.服务发布方式有多种,1.可以是自托管,说白了就是自己写的程序然后发布这个服务,程序关闭了,这个服务就不能被别人调用了,本例就是在控制台程序中发布这个服务。2.是通过windows service,3,是通过IIS发布.
wcf的service实质上是一个EndPoint的集合.EndPoint包括三个要素:ABC.Address,Binding,Contract. Contract已经定义好了.client与调用服务的时候需要知道服务在哪,address就指定了服务的位置,比如在本机发布可以指定位置”http://127.0.0.1:9877/cal”或者”net.tcp://127.0.0.0:9888/”这两种一个”http”开头的,一个是”net.tcp”开头,这就跟binding有关了,binding定义了服务以什么方式发布.包括BasicHttpBinding, NetTcpBinding等等很多种方式,再次就不细讲了。
ABC简而言之,A:服务在哪
B:服务怎么发布
C:服务要干什么
下面就是通过自托管方式启动一个服务。服务的发布可以通过代码配置,也可以通过配置文件发布,本文简单起见,通过代码进行配置,以后再一点一点详解其他地方。
class Program { static void Main(string[] args) { ServiceHost host = new ServiceHost(typeof(CalculateService), new Uri("http://127.0.0.1:9876/")); host.AddServiceEndpoint(typeof(ICalculateService), new BasicHttpBinding(),"cal"); host.Opened += new EventHandler((obj,arg) => { Console.WriteLine("Service Started,Press Enter Stop Service"); }); host.Open(); Console.ReadLine(); host.Closed += new EventHandler((obj, arg) => { Console.WriteLine("Service Stopped"); }); host.Close(); } }
至此,服务已经发布成功.地址是”http://127.0.0.1:9876/”+”cal”=”http://127.0.0.1:9876/cal”binding 如果是NetTcpBinding,地址就应该是”net.tcp:………”了。要发布的服务就是CalculatService。下面就开始调用这些服务。
client端也是用代码配置的
static void Main(string[] args) { ICalculateService client= ChannelFactory<ICalculateService>.CreateChannel(new BasicHttpBinding(),
new EndpointAddress("http://127.0.0.1:9876/cal")); Console.WriteLine(client.Add(1, 2)); Console.WriteLine(client.Factorial(4)); Console.WriteLine(client.FactorialMyNumber(new Number(5))); }
第一次写博客,欢迎大家指正。
源码
注:转载请注明出处 http://www.cnblogs.com/ITPuppy/archive/2013/04/03/2998618.html