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

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

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);
}
}

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

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.通过代码来实现服务寄宿

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服务配置编辑器”子项)

<?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>
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文件内容如下所示:

<%@ ServiceHost Language="C#" Debug="true" Service="WcfServiceLibrary1.CalculatorService" %>
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来调用相关方法。

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服务,前提是必需创建或引用文中第一步的服务契约及服务实现,然后便可使用如下方法:

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);
}
}
}

客户端配置文件如下:

<?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

WCF服务创建与使用(请求应答模式)的更多相关文章

  1. WCF服务创建与使用(双工模式)

    昨天发布了<WCF服务创建与使用(请求应答模式)>,今天继续学习与强化在双工模式下WCF服务创建与使用,步骤与代码如下. 第一步,定义服务契约(Service Contract),注意Se ...

  2. WCF分布式开发步步为赢(10):请求应答(Request-Reply)、单向操作(One-Way)、回调操作(Call Back).

    WCF除了支持经典的请求应答(Request-Reply)模式外,还提供了什么操作调用模式,他们有什么不同以及我们如何在开发中使用这些操作调用模式.今天本节文章里会详细介绍.WCF分布式开发步步为赢( ...

  3. [WCF编程]10.操作:请求/应答操作

    一.调用操作概述 WCF除了支持经典的服务端-客户端的请求/应答操作外,还提供了对其他操作类型的内建支持,包括:即发即弃的单向调用:允许服务将调用返回给客户端的双向回调:允许客户端或服务器处理大量负荷 ...

  4. wcf 服务创建,配置,测试

    一.WCF创建: 常规的创建WCF服务是通过SOAP传输的,很多网站开发人员想放弃使用XML而使用JSON,这个时候可以参照:http://www.cnblogs.com/zhili/p/WCFRes ...

  5. WCF服务创建与抛出强类型SOAP Fault

    原创地址:http://www.cnblogs.com/jfzhu/p/4060666.html 转载请注明出处 前面的文章<WCF服务的异常消息>中介绍过,如果WCF Service发生 ...

  6. Redis 请求应答模式和往返延时 Pipelining

    Redis是一个CS结构的TCP服务器,使用”请求-应答”的模式.,客户端发起一个请求是这样的步骤: 客户端发送一个请求给服务器,然后等待服务器的响应,一般客户端使用阻塞模式来等待服务器响应. 服务器 ...

  7. WCF服务创建到发布(SqlServer版)

    在本示例开始之前,让我们先来了解一下什么是wcf? wcf有哪些特点? wcf是一个面向服务编程的综合分层架构.该架构的项层为服务模型层. 使用户用最少的时间和精力建立自己的软件产品和外界通信的模型. ...

  8. 网络io模式(服务器请求应答模式)

    2014年1月19日 22:07:41 这几天看nginx 和 Apache的视频教程(马哥和邹老师)了解到了一些网络io模式(nginx的相关配置项为sendfile) 这里简单记录下来以备后用 A ...

  9. [老老实实学WCF] 第九篇 消息通信模式(上) 请求应答与单向

    老老实实学WCF 第九篇 消息通信模式(上) 请求应答与单向 通过前两篇的学习,我们了解了服务模型的一些特性如会话和实例化,今天我们来进一步学习服务模型的另一个重要特性:消息通信模式. WCF的服务端 ...

随机推荐

  1. Cron表达式备忘

    Cron表达式(在Quartz.net里面会用到) 由7段构成:秒 分 时 日 月 星期 年(可选)"-" :表示范围  MON-WED表示星期一到星期三"," ...

  2. mongodb(副本集)

    副本集是mongo下的一种集群配置方式: 1.通过oplog的方式将主节点数据同步到副本节点,oplog不记录查询语句(因为不改变数据): 2.mongo的副本集可以有一个主节点,多个副本节点,主节点 ...

  3. 【读书笔记】WebApi 和 SPA(单页应用)--knockout的使用

    Web API从MVC4开始出现,可以服务于Asp.Net下的任何web应用,本文将介绍Web api在单页应用中的使用.什么是单页应用?Single-Page Application最常用的定义:一 ...

  4. 如何用Unity GUI制作HUD

    若知其所以然,自然知其然. HUD是指平视显示器,就是套在脸上,和你的眼睛固定在一起,HUD的意思就是界面咯,一般我们说HUD特指把3D空间中的界面的某些信息(比如血条,伤害之类)的贴在界面上,对应3 ...

  5. Java中文编码小结

    Java中文编码小结 1. 只有 字符到字节 或者 字节到字符 的转换才存在编码转码; 2. Java String 采用 UTF-16 编码方式存储所有字符.unicode体系采用唯一的码点表示唯一 ...

  6. 《30天自制操作系统》笔记(02)——导入C语言

    <30天自制操作系统>笔记(02)——导入C语言 进度回顾 在上一篇,记录了计算机开机时加载IPL程序(initial program loader,一个nas汇编程序)的情况,包括IPL ...

  7. querySelector和querySelectorAll

    jQuery被开发者如此的青睐和它强大的选择器有很大关系,比起笨重的document.getElementById.document.getElementByName… ,查找元素很方便,其实W3C中 ...

  8. 缓存篇(Cache)~第二回 使用static静态成员实现服务器端缓存(导航面包屑)~续

    返回目录 在写完首篇cache文章后,有些朋友给我来信,希望可以使用JS的方法来实现这个导航功能,所以,才有了这篇文章,JS与C#不同,它虽然有引用类型,但它不具备一些引用类型的特性,如它的方法参数为 ...

  9. 第十六回 IoC组件Unity续~批量动态为Unity添加类型和行为

    回到目录 之前的一篇Unity的文章主要是基本的实现,并没有什么特别的地方,使用Unity可以方便的实现应用程序的IoC控制反转,这给我们的应用程序在耦合度上变得高了,同时可测试性加强了,当然,这些的 ...

  10. display的理解

    display可把框内显示的内容改变(自我理解) none 此元素不会被显示. block 此元素将显示为块级元素,此元素前后会带有换行符. inline 默认.此元素会被显示为内联元素,元素前后没有 ...