阿宽

Nothing is more powerful than habit!
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

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

Posted on 2010-10-18 22:27  宽田  阅读(3675)  评论(11编辑  收藏  举报

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还有其它许多方面的内容,有兴趣的朋友可以找其它方面的资料进行学习。