WCF服务创建与使用(请求应答模式)

简介:

不说废话,直接上代码。以下服务创建是在独立的WCF类库中,若采用WCF应程程序,定义及创建服务代码均相同,但文件名不同,是CalculatorService.svc

第一步,定义服务契约(Service Contract),即:定义一个服务接口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
using  System.ServiceModel;
 
namespace  WcfServiceLibrary1
{
     [ServiceContract(Namespace= "http://www.zuowenjun.cn" )]
     public  interface  ICalculator
     {
         [OperationContract]
         double  Add( double  x, double  y);
 
         [OperationContract]
         double  Subtract( double  x, double  y);
 
         [OperationContract]
         double  Multiply( double  x, double  y);
 
         [OperationContract]
         double  Divide( double  x, double  y);
     }
}

第二步,实现服务契约,即:实现第一步的接口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
namespace  WcfServiceLibrary1
{
     public  class  CalculatorService : ICalculator
     {
         public  double  Add( double  x, double  y)
         {
             return  x + y;
         }
 
         public  double  Subtract( double  x, double  y)
         {
             return  x - y;
         }
 
         public  double  Multiply( double  x, double  y)
         {
             return  x * y;
         }
 
         public  double  Divide( double  x, double  y)
         {
             return  x / y;
         }
     }
}

第三步,创建服务寄宿程序

WCF服务需要依存一个运行着的进程(宿主),服务寄宿就是为服务指定一个宿主的过程。WCF是一个基于消息的通信框架,采用基于终结点(Endpoint)的通信手段。终结点由地址(Address)、绑定(Binding)和契约(Contract)三要素组成

服务寄宿程序可以是控制台应用程序,winform,Windows服务,以及IIS(IIS的寄宿方法与以下代码实现不同)

1.通过代码来实现服务寄宿

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
using  System;
using  WcfServiceLibrary1;
using  System.ServiceModel;
using  System.ServiceModel.Description;
 
 
namespace  ConsoleApplicationHost
{
     class  Program
     {
         static  void  Main( string [] args)
         {
             BuildServiceHostByCode();
         }
 
         static  void  BuildServiceHostByCode()
         {
             using  (ServiceHost host = new  ServiceHost( typeof (CalculatorService)))
             {
                 host.AddServiceEndpoint( typeof (ICalculator), new  WSHttpBinding(), "http://127.0.0.1:12300/CalculatorService" );
                 if  (host.Description.Behaviors.Find<ServiceMetadataBehavior>() == null )
                 {
                     ServiceMetadataBehavior behavior = new  ServiceMetadataBehavior();
                     behavior.HttpGetEnabled = true ;
                     behavior.HttpGetUrl = new  Uri( "http://127.0.0.1:12300/CalculatorService/metadata" );
                     host.Description.Behaviors.Add(behavior);
                 }
                 host.Opened += (s, e) => { Console.WriteLine( "CalculaorService已经启动,按按回车键终止服务!" ); };
                 host.Open();
                 Console.ReadLine();
             }
         }
     }
}

2.通过Config配置文件来实现服务寄宿(可以直接使用VS提供的配置工具来配置WCF,方法:工具(Tools)菜单-->选择“WCF服务配置编辑器”子项)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<? xml  version="1.0" encoding="utf-8" ?>
< configuration >
   < system.serviceModel >
     < behaviors >
       < serviceBehaviors >
         < behavior  name="CalculatorServicemetadatabehavior">
           < serviceMetadata  httpGetEnabled="true" httpGetUrl="http://127.0.0.1:12306/CalculatorService/metadata"/>
         </ behavior >
       </ serviceBehaviors >
     </ behaviors >
     < services >
       < service  name="WcfServiceLibrary1.CalculatorService" behaviorConfiguration="CalculatorServicemetadatabehavior">
         < endpoint  address="http://127.0.0.1:12306/CalculatorService" binding="wsHttpBinding" contract="WcfServiceLibrary1.ICalculator">
         </ endpoint >
       </ service >
     </ services >
   </ system.serviceModel >
</ configuration >
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
using  System;
using  WcfServiceLibrary1;
using  System.ServiceModel;
using  System.ServiceModel.Description;
 
 
namespace  ConsoleApplicationHost
{
     class  Program
     {
         static  void  Main( string [] args)
         {
             BuildServiceHostByConfig();
         }
 
 
         static  void  BuildServiceHostByConfig()
         {
             using  (ServiceHost host = new  ServiceHost( typeof (CalculatorService)))
             {
                 host.Opened += (s, e) => { Console.WriteLine( "CalculaorService已经启动,按按回车键终止服务!" ); };
                 host.Open();
                 Console.ReadLine();
             }
         }
     }
}

3.通过IIS来实现服务寄宿

创建一个Asp.net空Web应用程序,然后添加一个WCF服务文件。这里WCF服务文件与Web 服务中的.asmx文件类似。基于IIS的服务寄宿要求相应的WCF服务具有相应的.svc文件,.svc文件部署于IIS站点中,对WCF服务的调用体现在对.svc文件的访问上。

WCF服务文件的内容很简单,仅仅包含一个ServiceHost指令,该指令具有一个必须的Service属性和一些可选的属性。所以对应的.svc文件内容如下所示:

1
<%@ ServiceHost Language="C#" Debug="true" Service="WcfServiceLibrary1.CalculatorService" %>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Web.Config配置如下(WCF服务配置均相同,唯一不同的是在添加终结点中无需指定地址,因为.svc所在的地址就是服务的地址。):
< configuration >
   < system.serviceModel >
     < behaviors >
       < serviceBehaviors >
         < behavior  name="CalculatorServicemetadatabehavior">
           < serviceMetadata  httpGetEnabled="true" />
         </ behavior >
       </ serviceBehaviors >
     </ behaviors >
     < services >
       < service  name="WcfServiceLibrary1.CalculatorService" behaviorConfiguration="CalculatorServicemetadatabehavior">
         < endpoint   binding="wsHttpBinding" contract="WcfServiceLibrary1.ICalculator">
         </ endpoint >
       </ service >
     </ services >
   </ system.serviceModel >
</ configuration >

第四步,在客户端程序中使用(调用)WCF服务

1.根据WCF服务发布的元数据地址引用WCF服务,系统自动生成一系列的类,包含一个服务契约接口、一个服务代理对象和其他相关的类。

2.直接使用系统自动生成的客户服务代理类CalculatorClient来调用相关方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
using  System;
using  ConsoleApplicationClient.CalculatorServices;
using  System.ServiceModel;
 
namespace  ConsoleApplicationClient
{
     class  Program
     {
         static  void  Main( string [] args)
         {
             CallServiceByReference();
             Console.WriteLine( "按任意键结束。" );
             Console.Read();
         }
 
         static  void  CallServiceByReference()
         {
             using  (CalculatorClient proxy = new  CalculatorClient())
             {
                 CallService(proxy.Add);
                 CallService(proxy.Subtract);
                 CallService(proxy.Multiply);
                 CallService(proxy.Divide);
             }
         }
 
         static  void  CallService(Func< double , double , double > serviceMethod)
         {
             Console.Write( "请输入第1数字:" );
             double  input1 = double .Parse(Console.ReadLine());
             Console.Write( "请输入第2数字:" );
             double  input2 = double .Parse(Console.ReadLine());
             double  result = serviceMethod(input1, input2);
             string  methodName = serviceMethod.Method.Name;
             Console.Write( "两数字{0}结果:{1}\n" , methodName, result);
         }
    }
}

3.上述使用方法的前提是引用WCF服务元数据地址,然后由VS系统自动生成一系列的类,我们也可在不引用的情况下,使用WCF服务,前提是必需创建或引用文中第一步的服务契约及服务实现,然后便可使用如下方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
using  System;
using  ConsoleApplicationClient.CalculatorServices;
using  System.ServiceModel;
 
namespace  ConsoleApplicationClient
{
     class  Program
     {
         static  void  Main( string [] args)
         {
             CallServiceByCode();
             Console.WriteLine( "按任意键结束。" );
             Console.Read();
         }
 
         static  void  CallServiceByCode()
         {
 
             //using (ChannelFactory<ICalculator> channelFactory = new ChannelFactory<ICalculator>(new WSHttpBinding(), "http://127.0.0.1:12306/CalculatorService"))
             //如果CONFIG文件中有配置endpoint,则可使用下面的构造函数(参数为指定endpoint的配置名称),若没有配置则需使用上面的构造函数(参数为指定绑定方式及服务地址)
             using  (ChannelFactory<ICalculator> channelFactory = new  ChannelFactory<ICalculator>( "WSHttpBinding_ICalculator" ))
             {
                 ICalculator proxy = channelFactory.CreateChannel();
                 using  (proxy as  IDisposable)
                 {
                     CallService(proxy.Add);
                     CallService(proxy.Subtract);
                     CallService(proxy.Multiply);
                     CallService(proxy.Divide);
                 }
             }
         }
 
         static  void  CallService(Func< double , double , double > serviceMethod)
         {
             Console.Write( "请输入第1数字:" );
             double  input1 = double .Parse(Console.ReadLine());
             Console.Write( "请输入第2数字:" );
             double  input2 = double .Parse(Console.ReadLine());
             double  result = serviceMethod(input1, input2);
             string  methodName = serviceMethod.Method.Name;
             Console.Write( "两数字{0}结果:{1}\n" , methodName, result);
         }
     }
}

客户端配置文件如下:

1
2
3
4
5
6
7
8
9
10
11
<? xml  version="1.0" encoding="utf-8" ?>
< configuration >
     < system.serviceModel >
         < client >
             < endpoint  address="http://127.0.0.1:12306/CalculatorService"
                 binding="wsHttpBinding"
                 contract="CalculatorServices.ICalculator" name="WSHttpBinding_ICalculator">
             </ endpoint >
         </ client >
     </ system.serviceModel >
</ configuration >

说明:发表这篇文章参考了如下作者的文章:

我的WCF之旅(1):创建一个简单的WCF程序

 

文章同步发表于我的个人网站:http://www.zuowenjun.cn/post/2015/03/24/132.html

本文转自 梦在旅途 博客园博客,原文链接: http://www.cnblogs.com/zuowj/p/4366917.html ,如需转载请自行联系原作者

相关文章
|
11月前
|
前端开发
WCF更新服务引用报错的原因之一
WCF更新服务引用报错的原因之一
|
10月前
|
C# 数据安全/隐私保护
c#如何创建WCF服务到发布(SqlServer版已经验证)
c#如何创建WCF服务到发布(SqlServer版已经验证)
41 0
|
10月前
|
安全 数据库连接 数据库
WCF服务创建到发布(SqlServer版)
在本示例开始之前,让我们先来了解一下什么是wcf? wcf有哪些特点? wcf是一个面向服务编程的综合分层架构。该架构的项层为服务模型层。 使用户用最少的时间和精力建立自己的软件产品和外界通信的模型。它使得开发者能够建立一个跨平台的安全、可信赖、事务性的解决方案。且能与已有系统兼容写作。 简单概括就是:一组数据通信的应用程序开发接口。
69 0
|
11月前
Visual Studio 2022 创建 WCF服务 找不到
Visual Studio 2022 创建 WCF服务 找不到
|
C++
WCF基础教程(二)——解析iis8和iis8.5+VS2013发布wcf服务问题
WCF基础教程(二)——解析iis8和iis8.5+VS2013发布wcf服务问题
109 0
WCF基础教程(二)——解析iis8和iis8.5+VS2013发布wcf服务问题
|
安全 网络协议 网络安全
WCF安全3-Transport与Message安全模式
WCF安全3-Transport与Message安全模式
107 0
WCF安全3-Transport与Message安全模式
WCF使用纯代码的方式进行服务寄宿
服务寄宿的目的是为了开启一个进程,为WCF服务提供一个运行的环境。通过为服务添加一个或者多个终结点,使之暴露给潜在的服务消费,服务消费者通过匹配的终结点对该服务进行调用,除去上面的两种寄宿方式,还可以以纯代码的方式实现服务的寄宿工作。
865 0
|
Windows
WCF服务寄宿到IIS
一.WCF简介: Windows Communication Foundation(WCF)是由微软开发的一系列支持数据通信的应用程序框架,可以翻译为Windows 通讯开发平台。整合了原有的windows通讯的 .net Remoting,WebService,Socket的机制,并融合有HTTP和FTP的相关技术。
1059 0
WCF服务自我寄宿
WCF服务的寄宿方式 WCF寄宿方式是一种非常灵活的操作,可以寄宿在各种进程之中,常见的寄宿有: IIS服务、Windows服务、Winform程序、控制台程序中进行寄宿,从而实现WCF服务的运行,为调用者方便、高效提供服务调用。
1003 0
|
网络架构
(纯代码)快速创建wcf rest 服务
因为有一个小工具需要和其它的业务对接数据,所以就试一下看能不能弄一个无需配置快速对接的方法出来,百(以)度(讹)过(传)后(讹),最后还是对照wcf配置对象调试出来了: 1.创建WebHttpBinding 2.
985 0