加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

WCF学习笔记(一),WCF预览

发布时间:2020-12-17 01:26:33 所属栏目:安全 来源:网络整理
导读:原文转自:http://www.systhinker.com/html/59/n-20659.html WCF的全称是:Windows Commnication Foundation.WCF,是微软对一系列产业标准定义的实现,是面向服务实现的比较好的途径。传统的三层结构模式一般为:数据访问层、业务逻辑层、客户层,但是这种模

原文转自:http://www.systhinker.com/html/59/n-20659.html

WCF的全称是:Windows Commnication Foundation.WCF,是微软对一系列产业标准定义的实现,是面向服务实现的比较好的途径。传统的三层结构模式一般为:数据访问层、业务逻辑层、客户层,但是这种模式下客户层与业务逻辑层的耦合较为紧密,而面向服务则使得客户层跟业务逻辑上实现松耦合。
地址
WCF的每个服务都需要有一个地址的,而且只能有一个,WCF支持多种传输:
????1.HTTP
????2.TCP
????3.对等网
????4.内部进程通信
????5.MSMQ
通常的地址包括两个方面:1.服务位置、2.传输的协议。如基于tcp的地址:net.tcp://localhost:8800/Henllyee.Service,在这里net.tcp就是传输的协议,而后面就是告诉服务的位置。

契约
WCF所有的服务都是公开为契约,当你使用这个服务是就比约遵循一定的契约。契约的表示就想webservice里的表示,也是通过属性标签来标识的。WCF定义了四种契约类型:
1.服务契约(Service Contract):定义客户端能够执行的服务操作。
2.数据契约(Data Contract):定义于服务交互的数据类型。
3.错误契约(Fault Contract):定义抛出的错误。
4.消息契约(Message Contract):定义直接与服务交互的消息。
服务契约是要广泛使用的,定义个服务契约是很简单的,只是在一些服务接口上进行标识即可。

namespace?HenllyeeWCF.Service

{

????[ServiceContract(Namespace
="http://henllyee.cnblogs.com")]

????
public?interface?IHello

????
{

????????[OperationContract]

????????
string?SayHello(?strName);

????}

????
class?Hello:IHello

????
{

????????
?strName)

????????
{

????????????
return?String.Format({0}?say?hello?at?{1},?strName,?DateTime.Now.ToString());

????????}

????}

}

首先我们要在接口或则类上标识为"ServiceContract",其中有两个可选的参数:"Namespace"、"Name",即指定命名空间跟类或则接口的名称。而即使是应用了ServiceContract,也不是类型的成员就是契约中的,还必须显示的用OperationContract来暴露操作,为了方便重载,OperationContract提供了可选参数:Name来指定暴露操作的另外的名称。
注意点:服务契约只能定义在接口或者类上,OperationContract只能应用到方法上。建议服务契约定义在接口上面。

托管
每个WCF的服务必须托管在进程中,每个托管进程可以托管多个服务,而每个服务也可以由多个进程托管。托管可以有几种:
1.IIS托管。IIS托管可以在客户端请求是启动,不需一直启动,但它只能使用HTTP协议。
2.自托管。必须手工通过程序来控制托管的启动跟关闭。
3.WAS。只使用Vista,跟IIS托管一样,但并不局限于HTTP。
下面写一个自托管的控制台程序:

namespace ?HenllyeeWCF.Host

{

????
?Program

????
staticvoid?Main([]?args)

????????
using?(ServiceHost?host?=new?ServiceHost(typeof(HenllyeeWCF.Service.Hello)))

????????????
{

????????????????host.AddServiceEndpoint(
(HenllyeeWCF.Service.IHello),??NetTcpBinding(),?net.tcp://localhost:8000/Hello);

????????????????host.Open();

????????????????Console.Read();

????????????}

????????}

}

WCF客户端跟服务器端的交互一般是采用EndPoint来交互的,每个EndPoint是由Address(地址)、Binding(绑定)、Contract(契约)组成的。而服务器端是通过暴露EndPoint来交互的。在程序中首先我们定义了一个ServiceHost,同时指定了服务为我们已经定义的HenllyeeWCF.Service.Hello,同时跟host添加一个终节点,然后打开host,等待用户取消进程。

客户端
首先,入门启动host后可以通过,在客户端添加服务应用的方式来实现服务的调用。也可以自己编程的方式来实现。

?HenllyeeWCF.Client

{

????[ServiceContract(Namespace?
??IHello

????


????
?Program

????
[]?args)

????????
{

????????????IHello?proxy?
?ChannelFactory<IHello>.CreateChannel(

????????????????????????
?EndpointAddress());


????????????Console.WriteLine(proxy.SayHello(
Henllyee?Cui));

????????????Console.Read();

????????}

}

首先我针对服务定义了完全相同的接口,然后通过使用通道ChannelFactory来实现代理,指定绑定、跟EndPoint的地址就可以了。
整个解决方案的体系结构如图:


然后我们首先来运行下Host,在运行Client端出现效果图:


WCF学习笔记系列链接:

WCF学习笔记(一),WCF预览

WCF学习笔记(二),服务契约

WCF学习笔记(三),数据契约

WCF学习笔记(四),数据契约的事件

WCF学习笔记(五),数据契约的已知类型

WCF学习笔记(六),实例类型

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读