您的位置:首页 > 其它

WCF入门实例

2013-04-05 20:50 176 查看
本文是一个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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: