为什么称为手动编写方式,是因为服务使用手工方式编写,并且客户端调用时不采用引用服务的方式,而是采用编写代码的方式调用。
用例子来说明。例子的功能是通过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,变成下边代码。
namespace WcfManualService
{
// 契约
[ServiceContract]
public interface IManulService
{
// 操作
[OperationContract]
string GetData();
}
}
2.2、编写服务类型
服务类型是契约实现。修改WcfManualService项目中的ManulService,变成下边代码。
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.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代码基本相同。代码如下。
namespace UserClient
{
[ServiceContract]
public interface IManulService
{
[OperationContract]
string GetData();
}
}
4.4、编写ManulService代码
ManulService代码与WcfManualService中ManulService代码不同,此处必须继承自System.ServiceModel.ClientBase<IManulService>,并且用partial定义。代码如下。
namespace UserClient
{
public partial class ManulService : System.ServiceModel.ClientBase < IManulService > , IManulService
{
public string GetData()
{
return base .Channel.GetData();
}
}
}
4.5、最后编写客户端Program代码
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还有其它许多方面的内容,有兴趣的朋友可以找其它方面的资料进行学习。