zoukankan      html  css  js  c++  java
  • 学习构建一个简单的wcf服务

    入门,构建第一个WCF程序

    1、服务端

    建立一个控制台应用程序作为Server,新建一个接口IData作为服务契约。这个契约接口一会儿也要放到Client端,这样双方才能遵循相同的标准。别忘了添加对

    针对这个接口建立实现类,这个类才是真正干活的,工作在服务端,不出现在客户端:

    using System;
    
    using System.Text;
    
    namespace Server
    
    {
    
       /// <summary>
    
       /// 实现IData接口,此处不需要写契约标记
    
       /// </summary>
    
       public class DataProvider : IData
    
       {
    
           public string SayHello(string userName)
    
           {
    
               return string.Format("Hello {0}.", userName);
    
           }
    
       }
    
    }

    为工程添加一个App.config文件,这里面要定义与服务发布相关的参数。WCF中常见的做法是用代码写服务逻辑,但是用配置文件来定义服务发布方式,这样做的好处是松散耦合。


    万事具备,只剩最后一步了,将服务发布出去:

    1. using System;
      
      using System.ServiceModel;
      
      namespace Server
      
      {
      
         class Program
      
         {
      
             static void Main(string[] args)
      
             {
      
                 //定义一个ServiceHost,注意参数中要使用契约实现类而不是接口
      
                 using(ServiceHost host = new ServiceHost(typeof(Server.DataProvider)))
      
                 {
      
                     host.Open();
      
                     Console.WriteLine("Service Running ...");
      
                     Console.ReadKey();
      
                     host.Close();
      
                 }
      
             }
      
         }
      
      }

    有人可能会问服务发布到哪去了?没指定地址呀?这是一个初学者容易搞不明白的地方。

    是的,此时App.config中的定义就发挥作用了,由于ServiceHost中指定对Server.DataProvider类服务,而App.config中定义了name="Server.DataProvider"的service,其下有endpoint,定义了绑定方式是basicHttpBinding,而http方式的baseAddress只有一个,就是 http://localhost:8080/wcf。

    编译运行,屏幕显示Service Running ... 就是正常跑起来了,此时如果用命令行 netstat -ano | findstr "8080" 看一下,应该有如下输出:

    1. TCP    0.0.0.0:8080         0.0.0.0:0          LISTENING      4

    2. TCP    [::]:8080            [::]:0             LISTENING      4

    表示我们的程序已经在TCP 8080端口开始监听了。值得注意的是PID是4,这是系统进程而不是我们自己的进程,这说明WCF程序对外提供HTTP服务时,是借用了系统功能(http.sys)。

    此时如果我们用浏览器访问一下 http://localhost:8080/wcf,不报错,但是会提示“当前已禁用此服务的元数据发布”,这是由于默认不允许以http get方式获取服务的WSDL,我们不用管它,不影响后面的使用,以后的章节中我们再来看这个问题。


    2、客户端

    再建立一个控制台应用程序作为Client,把Server中的接口IData拷过来,因为这是服务契约。

    为工程添加一个App.config文件,这里面要定义客户端访问的相关参数,这里我去掉了一些用不上的参数,以保持配置文件简单,防止各位看晕了头。

    1. <?xmlversion="1.0"encoding="utf-8"?>
      
      <configuration>
      
       <system.serviceModel>
      
         <!-- 看到client,就表明是客户端设置 -->
      
         <client>
      
           <!-- 定义访问时的终节点,name也是随意取的,注意address是Server端发布时指定的baseAddress+endpoint的address,binding也要对应,contract就更不用说了,由于之前把IData.cs拷过来的时候没有修改命名空间,所以还是Server.IData -->
      
           <endpointname="DataService"address="http://localhost:8080/wcf"binding="basicHttpBinding"contract="Server.IData"/>
      
         </client>
      
       </system.serviceModel>
      
      </configuration>

    然后写代码,来调用Server端发布的SayHello方法:

    using System;
    
    using System.ServiceModel;
    
    using System.ServiceModel.Channels;
    
    namespace Client
    
    {
    
       class Program
    
       {
    
           static void Main(string[] args)
    
           {
    
               //客户端访问有多种方式,此处只显示一种
    
               //利用ChannelFactory的CreateChannel方法创建一个IData的代理对象,其中参数“DataService”就是刚才在App.config中定义的endpoint的名称
    
               var proxy = new ChannelFactory<Server.IData>("DataService").CreateChannel();
    
    //调用SayHello方法
    
               Console.WriteLine(proxy.SayHello("WCF"));
    
    //用完后一定要关闭,因为服务端有最大连接数,不关闭会在一定时间内一直占着有效连接
    
               ((IChannel)proxy).Close();
    
           }
    
       }
    
    }
    View Code

    编译运行,屏幕应能正常打印出“Hello WCF.”。第一个入门demo就搞定了,应该还是比较简单的。只是App.config的配置有些复杂,后面我们会看到,其实也可以不要配置,直接用代码搞定,不过从松散耦合的角度讲不建议这么做。

  • 相关阅读:
    在cmd命令行中弹出Windows对话框
    Windows远程桌面连接如何直接使用剪贴板功能
    升级Windows10后Apache服务器启动失败的解决方法
    Windows下尝试PHP7提示丢失VCRUNTIME140.DLL的问题解决
    手动构建Servlet项目的流程
    更改Apache默认网站根目录
    windows下安装Appserv等php套件之后无法进入数据库管理的问题
    Java web项目的字符集问题
    五谷-小米:白小米
    五谷-小米:黑小米
  • 原文地址:https://www.cnblogs.com/zhaoyunfei/p/wcfrumen.html
Copyright © 2011-2022 走看看