zoukankan      html  css  js  c++  java
  • WCF学习总结

    1. WCF简介

        WCF (Windows Communication Foundation)是由微软发展的一组数据通信的应用程序开发借口。WCF由服务地址(Address) 、协议绑定 (Binding)和 契约(Contract)三部分组成,既“ABC”。

    2. 为什么用WCF

        WCF既支持具有互操作性的Web服务,也能够实现.NET客户端与.NET服务端的通信,提供了分布式事务的支持,同时在安全性上,它完全遵循了WS-*的标准,此外,它还支持队列服务,可以非常方便地利用消息队列完成异步操作与脱机调用。

    特性

    Web Service

    .NET Remoting

    Enterprise Services

    WSE

    MSMQ

    WCF

    具有互操作性的Web服务

    支持

     

     

     

     

    支持

    .NET到.NET的通信

     

    支持

     

     

     

    支持

    分布式事务

     

     

    支持

     

     

    支持

    支持WS标准

     

     

     

    支持

     

    支持

    消息队列

     

     

     

     

    支持

    支持

    WCF引入了用通道,它封装了消息的通信细节,例如编码、事务处理、安全等,然后又通过引入绑定的概念,封装了通道的组成顺序与处理细节。最后,引入了独有的Endpoint元素,集成了地址、绑定和契约之间的“三位一体”,以最简单的方式定义和发布服务。

    3. Web Service 的两种使用方式:  

        1. 直接在VS 环境中创建WebService服务

           在创建的项目下,会生成一个IService.cs借口文件和Service.svc服务文件,在IService.cs文件中可以加入自己需要的方法签名。然后Service.svc服务文件实现了IService借口中的方法,之后你运行此项目,将会生成一个URL地址既服务地址:如http://localhost:47948/Service1.svc,复制这个地址,然后创建一个客户端应用程序,如windows forms或者控制台应用程序都行,创建好之后在Reference上右击添加Web服务,将此地址粘贴。然后再客户端的代码中写如下代码调用Server端的方法:

    ServiceClient sc=new  ServiceClient();

    sc.GetData();

    sc.Close();

    这样就可以实现WCF最简单的使用。

         2. 用SVCUtil.exe 编译服务地址

         在C:Program Files (x86)Microsoft SDKsWindowsv7.0ABin 此目录下有SvcUtil.exe 这个编译命令,她会将服务地址编译成一个.cs文件和一个.config配置文件。这样之后将这两个文件拷贝到客户端的项目中,使用上面的调用方法也可以得到相同的作用。

    运行cmd命令,输入:CD C:Program Files (x86)Microsoft SDKsWindowsv7.0ABin 再输入: SvcUtil.exe http://localhost:47948/Service1.svc -language:C# -out:C:WebTestUser.cs -config:C:WebTestUser.config 回车,他就会在C:WebTest下面生成User.cs和User.config文件。(注:User.config文件拷贝到项目中之后需要重命名为app.config或者 Web.config)。客户端调用代码同上。

    4. 自己写code配置服务的两种方法

        1. 自己写App.config配置服务信息

        代码如下:

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
    <system.serviceModel>
    <services>
    <service name="WinServiceTest.Test" behaviorConfiguration ="testBehavior">
    <host>
    <baseAddresses>
    <add baseAddress ="http://localhost:8080/test"/>
    </baseAddresses>
    </host>
    <endpoint address ="" binding="basicHttpBinding" contract ="Service.IService" >
    </endpoint>
    </service>
    </services>
    <behaviors >
    <serviceBehaviors >
    <behavior name="testBehavior">
    <serviceMetadata httpGetEnabled="true"/>
    </behavior>
    </serviceBehaviors>

    </behaviors>
    </system.serviceModel>
    </configuration>

            然后在客户端 写如下代码host起服务器:

    ServiceHost host = null;
    private void button1_Click(object sender, EventArgs e)
    {
    host = new ServiceHost(typeof(WinServiceTest.Test));
    host.Open();
    label1.Text = "服务已经启动";
    }

          注:WinServiceTest.Test 是当前项目中的一个累,继承了Server端的借口类,并实现了他的方法。当这个服务启动起来之后,我们可以检测他到底是不是启动起来了,我们可以用浏览器打开上面写得那个baseAddress中的地址进行确定,如果打开像WebService中的那样,那就证明我们启动起来了,如果出现错误,估计就配对不对。

          在启动服务有可能会报这个错误:"HTTP 无法注册 URL http://+:8080/test/。进程不具有此命名空间的访问权限“,处理这个错误的方法是关闭VS,然后用管理员身份运行VS就可以了。

    在创建一个客户端去调用服务端的方法有两种,第一种就是用添加Web服务引用的方式将baseAddress中的服务地址添加进去,然后通过ServiceClient去访问。

    第二种还是用代码去访问,代码如下:

    //地址
    EndpointAddress a = new EndpointAddress("http://localhost:8080/test");
    //绑定
    BasicHttpBinding btb = new BasicHttpBinding();
    //通道工厂
    ChannelFactory<Service.IService> cf = new ChannelFactory<Service.IService>(btb, a);
    Service.IService sis = cf.CreateChannel();
    int t = sis.Add(3, 5);
    MessageBox.Show(t.ToString());

    这样就可以实现自己配置服务器,自己去host服务器,然后调用方法。

         2. 用Code 配置服务器 host起服务器

         代码如下:

    ServiceHost host = null;
    private void button1_Click(object sender, EventArgs e)
    {
    host = new ServiceHost(typeof(WinTest.Test));
    NetTcpBinding tcp=new NetTcpBinding ();
    string a = "net.tcp://localhost/test";
    host.AddServiceEndpoint(typeof(Service.IService), tcp, a);
    host.Opened += delegate { label1.Text = "服务已经启动!"; };
    host.Open();
    }

    private void button2_Click(object sender, EventArgs e)
    {
    if (host.State == CommunicationState.Opened)
    host.Close();
    label1.Text = "服务已经关闭";
    }

    然后同上创建一个客户端去调用服务器端的方法:

    //地址
    EndpointAddress a = new EndpointAddress("net.tcp://localhost:8080/test");
    //绑定
    NetTcpBinding btb = new NetTcpBinding();
    //通道工厂
    ChannelFactory<Service.IService> cf = new ChannelFactory<Service.IService>(btb, a);
    Service.IService sis = cf.CreateChannel();
    int t= sis.Add(3, 5);
    MessageBox.Show(t.ToString());

    4. 总结

      上面是简单的WCF的四种应用,WCF在如今的大多数项目应用很广泛。

       除过上面的简单例子,我们还可以用一下网上公布的服务地址如天气预报服务地址,号码归属地查询等一些WebService服务,用法就是将这些服务添加到自己的项目中,然后通过对应的ServiceClient 去调用。

  • 相关阅读:
    Saiku相关异常处理(十五)
    Saiku登录源码追踪.(十三)
    Saiku调用WS接口(十四)
    Saiku本地编译运行后Debug调试(十二)
    Windows查看Java内存使用情况
    Saiku免登录嵌入其他系统使用(十一)
    Saiku更改源代码实现默认查询一天的数据(十)
    Saiku关于MDX过滤的使用-默认显示最近一周的数据(九)
    Saiku部分函数解析(八)
    Saiku缓存处理(七)
  • 原文地址:https://www.cnblogs.com/baoyi/p/WCFStudy.html
Copyright © 2011-2022 走看看