zoukankan      html  css  js  c++  java
  • WCF快速入门——纯手工方式编写WCF入门程序

    WCF快速入门——纯手工方式编写WCF入门程序

      为什么称为手动编写方式,是因为服务使用手工方式编写,并且客户端调用时不采用引用服务的方式,而是采用编写代码的方式调用。

      用例子来说明。例子的功能是通过WCF得到字符串“Hello! 纯手工WCF服务调用成功!”。例子代码用Vs2010编写。


    建立步骤

      与前一篇文章“WCF快速入门——半自动方式编写WCF入门程序”相似,我们要建立三个项目:
        1)服务
        2)运行服务的平台,即服务宿主
        3)客户端

       注:以下程序用VS2010编写。 

     

    一、建立方法
      1.1、新建一个空方案WcfManual。
      1.2、在空方案WcfManual中建立三个项目,如下表。

    项目名称

    类型

    用途

    WcfManualService

    Class Library

    用于建立WCF服务。

    WcfManualHost

    Console Application

    运行WCF 服务的平台。即WCF 服务的宿主。

    UserClient

    Console Application

    客户端。用于调用WCF。

      1.2、在WcfManualService中增加一个接口IManulService,并修改原有类名称为ManulService,最终此方案如下图。   

    二、编写服务,即编写WcfManualService项目
       此处服务与前边文章介绍的服务有点区别,前边是模板创建,这里我们用类库代替。前一篇文章中服务有契约和服务类型,这里我们用IManulService作为契约;用ManulService作为服务类型。


       2.1、添加引用
         在WcfManualService项目中填加System.ServiceModel的引用。
      2.1、编写契约
         WCF契约其实是个接口。修改WcfManualService项目中的IManulService,变成下边代码。

    using System.ServiceModel;

    namespace WcfManualService
    {
        
    //契约
        [ServiceContract]
        
    public interface IManulService
        {
            
    //操作
            [OperationContract]
            
    string GetData();
        }
    }

      2.2、编写服务类型
        服务类型是契约实现。修改WcfManualService项目中的ManulService,变成下边代码。

    namespace WcfManualService{

        
    public class ManulService : IManulService
        {
            
    #region IManulService Members
            
    public string GetData()
            {
                
    return "Hello! 纯手工WCF服务调用成功!";
            }
            
    #endregion
        }
    }

      这样基本服务已建好。

    三、编写运行服务,即编写宿主
       上一篇文章中我们使用配置文件的形式编写WCF服务宿主,在这里我们将全部使用代码的方式来启动服务。


       建立WCF宿主方法:
       3.1、添加引用。
          在“WcfManualHost”项目中需要添加两个引用,一是WCF必须引用的类System.ServiceModel。二是WCF的服务WcfManualService。如下图。

       3.2、编写宿主代码
         打开“WcfManualHost”项目中的Program.cs,并编写下边代码。在代码中我们会发现终结点、地址、行为都会被定义。代码完成后,启动和关闭服务的代码就编写好了。

    using System.ServiceModel;
    using System.ServiceModel.Description;

    namespace WcfManualHost
    {
        
    class Program
        {
            
    static void Main(string[] args)
            {
                
    //定义服务
                using (ServiceHost host = new ServiceHost(typeof(WcfManualService.ManulService)))
                {
                    
    //定义绑定
                    System.ServiceModel.Channels.Binding httpBinding = new BasicHttpBinding();
                    
    //定义终结点
                    host.AddServiceEndpoint(typeof(WcfManualService.IManulService), httpBinding, "http://localhost:8002/");
                    
    if (host.Description.Behaviors.Find<System.ServiceModel.Description.ServiceMetadataBehavior>() == null)
                    {
                        
    //定义行为
                        ServiceMetadataBehavior behavior = new ServiceMetadataBehavior();
                        behavior.HttpGetEnabled 
    = true;
                        //获取元数据地址
                        behavior.HttpGetUrl 
    = new Uri("http://localhost:8002/ManualService");
                        host.Description.Behaviors.Add(behavior);
                        //宿主启动完成后事件
                        host.Opened 
    += delegate
                        {
                            Console.WriteLine(
    "WCF手工服务已运行,按任意建退出!");
                        };
                        
    //运行
                        host.Open();
                        Console.ReadKey();
                        
    //关闭
                        host.Close();
                    }
                }
            }
        }
    }

       3.3、测试宿主程序
        将“WcfManualHost”项目设为启动项目。运行程序。结果如下图

        我们在浏览器中输入“http://localhost:8002/ManualService”测试服务是否正常。正常结果如下图。

    四、编写客户端

      4.1、添加服务引用
        在UserClient项目中添加System.ServiceModel的引用。  


       4.2、添加文件
       与WcfManualService项目一样,增加与WcfManualService项目中相同的文件,分别为接口IManulService和类ManulService。这两个文件主要用作客户端代理。最终客户端项目如下图。

      4.3、编写IManulService代码

        IManulService代码与WcfManualService中IManulService代码基本相同。代码如下。

    using System.ServiceModel;

    namespace UserClient
    {
        [ServiceContract]
        
    public interface IManulService
        {
            [OperationContract]
            
    string GetData();
        }
    }

      4.4、编写ManulService代码

        ManulService代码与WcfManualService中ManulService代码不同,此处必须继承自System.ServiceModel.ClientBase<IManulService>,并且用partial定义。代码如下。

    using System.ServiceModel;

    namespace UserClient
    {
        
    public partial class ManulService : System.ServiceModel.ClientBase<IManulService>, IManulService
        {
            
    public string GetData()
            {
                
    return base.Channel.GetData();
            }
        }
    }

      4.5、最后编写客户端Program代码

    using System.ServiceModel;
    using System.ServiceModel.Channels;
    using System.ServiceModel.Description;
    namespace UserClient
    {
        
    class Program
        {
             
    /*
               编写服务客户端方式
              
    */
            
    static void Main(string[] args)
            {
                
    //此处地址为服务器EndPoint地址,而不是元数据地址。
                string address = "http://localhost:8002/";
                ChannelFactory
    <IManulService> channel=
                    
    new ChannelFactory<IManulService>(
                        
    new BasicHttpBinding(),
                        
    new EndpointAddress(
                            
    new Uri(address)));
                IManulService proxy 
    = channel.CreateChannel();
                Console.WriteLine(
    "WCF调用结果为:{0}", proxy.GetData());            
                Console.ReadKey();
            }
        }
    }

      4.6、运行程序
       先启动“WcfManualHost”,后运行“UserClient”,出现结果如下图。


       注:

        1) 启动“WcfManualHost”可以在WcfManualHost项目的Debug文件夹中启动。也可以设置方案的启动顺序,启动这两个项目。 
        2) 客户端写代码的方式还有其它的方法,这里只介绍一种供大家学习。

      源码下载:WcfManual.rar

      WCF快速入门已全部介绍完。主要通过三个列子来了解WCF。这几篇文章涉及的一些WCF专用词语,当你回头再看这些词语时会更容易理解。对于一些词语意思网上有许多说明的文章,这里就不作说明。WCF还有其它许多方面的内容,有兴趣的朋友可以找其它方面的资料进行学习。

  • 相关阅读:
    实习感悟——从用户中来,到用户中去
    FineUI PK DWZ
    Java入门到精通——工具篇之Maven概述
    信息论的熵
    菜鸟学习Hibernate——一对多关系映射
    StyleCop学习笔记——默认的规则
    StyleCop学习笔记——自定义规则
    StyleCop学习笔记——初识StyleCop
    好博客收藏
    菜鸟学习Hibernate——简单的增、删、改、查操作
  • 原文地址:https://www.cnblogs.com/scottckt/p/1855151.html
Copyright © 2011-2022 走看看