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