码迷,mamicode.com
首页 > 其他好文 > 详细

重新学习WCF

时间:2014-07-19 19:16:20      阅读:197      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   使用   os   

      近来工作不怎么忙,一直在想一个问题,今年刚刚毕业,对于我们这应届生到底应该学习那些技术呢? 面对着现在技术横生,到底哪项是适合自己的呢?自己一直都在迷茫,若有那位大神再次经过,望给出您宝贵的建议。

     最近思来想去,觉得首先应该将分布式和云计算学习好,云计算赶脚很高端大气上档次,自觉打好基础在学习,提到分布式,想到了微软的分布式通讯技术WCF. WCF曾经学习看过一点,到都是蜻蜓点水,就知道有WCF这回事,今天决定重新来学习下,希望每天记录点学习成果。

     废话不多说了,进入正题。今天写了一个最基础的WCF例子,在这里记录,本人菜鸟一枚,希望给位大神不要见笑。

 

   第一步:创建一个空的解决方案,解决方案中有四个项目:

    bubuko.com,布布扣

  IService项目需要引用System.ServiceModel  定义了服务契约的类库项目,

  CalculatorService项目引用IService项目,用于定义服务类型的项目,实现IService项目中定义的服务契约,

  WcfHost项目 是作为宿主的控制台项目,

 WcfClient 项目是模拟服务的客户端程序。

 

第二步:创建服务契约

 

namespace IService
{
    [ServiceContract(Name = "CalculatorService", Namespace = "http://www.sun.com/")]
    public interface ICalculatorService
    {
        [OperationContract]
        double add(double x, double y);

        [OperationContract]
        double Subtract(double x, double y);

        [OperationContract]
        double Mul(double x, double y);

        [OperationContract]
        double Divide(double x, double y);

    }
}

     服务契约其实就是一接口,抽象定义服务的所有操作,说直白点,就是两个人说定好,我们该这样做,我们需要在接口上加上ServiceContract 特性 ,将其定义成服务契约,此外还需要说明契约的名称和命名空间。另外还需要在各个方法上定义OperationContract 特性,这样才能暴露给别人调用。

 

  第三步: 创建服务

  创建服务其实就是实现刚刚写好的接口

  public class CalculatorService:ICalculatorService
    {
        public double add(double x, double y)
        {
            return x + y;
        }

        public double Subtract(double x, double y)
        {
            return x - y;

        }

        public double Mul(double x, double y)
        {
            return x * y;
        }

        public double Divide(double x, double y)
        {
            return x / y;
        }
    }

 

第四步:通过自我寄宿的方式寄宿服务

  服务寄宿有两种方式:寄宿在IIS里面,自我寄宿的方式。我们这里使用的是自我寄宿的方式,即通过控制台的方式寄宿。

 WCF 采用终结点的方式进行通讯,终结点由即所谓的ABC组成,A-Address B-Binding  C-Contract 三元素组成,很好记得。

 地址(Address):决定服务的位置,解决服务寻址的问题。

 绑定(Banding):实现通讯的所有细节,包括网络传输,信息编码等等,WCF中有BasicHttpbinding,WSHttpbinding等等,

 契约(Contract):对服务契约的抽象操作。

 

class Program
    {
        static void Main(string[] args)
        {
            using(ServiceHost host = new ServiceHost(typeof(CalculatorService)))
            {
                host.Opened += delegate
                {
                    Console.WriteLine("服务启动。。。");
                };
                host.Open();
                Console.Read();
            }
        }
    }

当然这样肯定不行,我们需要在配置文件中配置刚刚所说的ABC 及终结点:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
    <system.serviceModel>
        <behaviors>
            <serviceBehaviors>
                <behavior name="metadataBehavior">
                    <serviceMetadata httpGetEnabled="true"  httpGetUrl="http://localhost:8080/calculatorservice/metadatebehavior" />
                </behavior>
            </serviceBehaviors>
        </behaviors>
        <services>
            <service name="CalculatorServices.CalculatorService" behaviorConfiguration="metadataBehavior">
                <endpoint address="http://localhost:8080/calculatorservice" binding="wsHttpBinding"  contract="IService.ICalculatorService"/>                                        
            </service>
        </services>
        
    </system.serviceModel>
</configuration>

配置这里有几个坑 behaviorConfiguration属性的值必须在前面已经配置好<behavior name="metadataBehavior"> 节点 。<service name="CalculatorServices.CalculatorService" 这里的name值为继承了服务契约的完整类引用,包括完整的命名空间。即实现了接口的类。 contract="IService.ICalculatorService"/>  contract的值为服务契约的类引用,即我们创建的接口。

宿主做好了 我们需要把宿主运行起来,这样客户端才能引用我们的服务,在运行宿主程序时又遇到一个坑了,直接运行报 HTTP 无法注册 URL http://+:8080/calculatorservice/。进程不具有此命名空间的访问权限 这个错误。原来宿主程序需要用管理员权限运行,我们关掉VS 以管理员权限打开再次运行就可以

 

 第五步:创建客户端调用程序

 bubuko.com,布布扣

这里也有个坑 地址是<serviceMetadata httpGetEnabled="true" httpGetUrl="http://localhost:8080/calculatorservice/metadatebehavior" /> 节点中的地址

客户端调用程序很简单:

 class Program
    {
        static void Main(string[] args)
        {
            MSR.CalculatorServiceClient client = new MSR.CalculatorServiceClient();
            //调用Add()方法
            double add = client.add(1, 1);
            Console.WriteLine(add);

            //调用Subtract()方法
            double sub = client.Subtract(2, 1);
            Console.WriteLine(sub);

            //调用Mul()方法
            double mul = client.Mul(2, 1);
            Console.WriteLine(mul);

            //调用div()方法
            double div = client.Divide(2, 1);
            Console.WriteLine(div);

            Console.Read();
        }
    }

 

 至此一个简单的WCF程序就此做完了。

重新学习WCF,布布扣,bubuko.com

重新学习WCF

标签:style   blog   http   color   使用   os   

原文地址:http://www.cnblogs.com/sjm19910902/p/3853523.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!