【WCF】基础

什么是WCF

WCF是基于Windows平台下开关和部署服务的SDK。WCF为服务提供了运行时环境,使得开发者能够将CLR类型公开为服务,又能够以CLR类型的方式使用服务。WCF是微软对一系列产品标准定义的实现,包括服务交互、类型转换、封送以及各种协议的管理。正因如此,WCF才能够提供服务之间的互操作性。

服务

服务(Service)是公开的一组功能的集合。从软件设计的角度考虑,软件设计思想经历了从函数发展到对象,从对象发展到组件,再从组件发展到服务的几次变迁。面向服务(ServiceOrientation SO)是一组原则的抽象,是创建面向服务应用程序的最佳实践。
服务可以是本地的,也可以是远程的,可以由多个参与方使用任意技术进行开发。服务的客户端只是使用服务功能的一方。理论上讲,客户端可以是任意的。
客户端与服务通过消息的发送与接收进行交互。消息可以直接在客户端与服务之间进行传递,也可以通过中间方进行传递。WCF中的消息通常是SOAP消息,这些消息与传输协议无关。
因为服务的创建对外界而言是不透明的,所以WCF服务通常通过公开元数据的方式描述可用的功能以及服务可能采用的通信方式。元数据的发布可以预先定义,它与具体的技术无关。

服务的执行边界

WCF不允许客户端直接与服务交互,即使它调用的是本地机器内存中的服务。相反,客户端总是使用代理(proxy)将调用转发给服务。代理公开的操作与服务相同,同时还增加了一些管理代理的方法。
WCF允许客户端跨越执行边界与服务通信。在同一台机器中,客户端可以调用同一个应用程序域中的服务,也可以在同一进程中跨应用程序域调用,甚至跨进程调用。在不同的机器情况下,客户端可以跨越Internet或者Intrannet的边界与服务交互。

WCF与位置透明度

WCF要求客户端保持一致的编程模型,而不用考虑服务的位置。由于所有的交互操作都经由代理完成,要求相同的配置与托管方式,因而对于本地和远程方式而言,WCF都只需要维持相同的编程模型。

地址

WCF的每一个服务都具有一个唯一的地址(Address)。地址包含两个重要元素:服务位置传输协议,或者是用于服务
通信的传输样式。服务位置包括机器名、站点或网络、通信端口、管道或队列,以及一个可选的特定路径或者URI。
TCP地址
TCP地址采用net.tcp协议进行传输。
HTTP地址
HTTP地址使用http协议进行传输,也可以利用https进行安全传输。HTTP地址通常会被用作对外的基于Internet的服务。
IPC地址
IPC地址使用net.pipe进行传输,这意味着它将使用Windows的命名管道机制。在WCF中,使用命名管道的服务只能接收来自同一台机器的调用。因此,在使用时必须指定明确的本地机器名或者直接命名为localhost。每台机器只能打开一个命名管道。
MSMQ地址
MSMQ地址使用net.msmq进行传输,即使用了微软消息队列机制。使用时必须为MSMQ地址指定队列名。如果是处理私有队列,则必须指定队列类型,但对于公有队列而言,队列类型可以省略。
对等网地址
对等网地址使用net.p2p进行传输,它是用了Windows的对等网传输机制。

契约

WCF的所有服务都会公开为契约。契约与平台无关,是描述服务功能的标准方式。WCF定义了四种类型的契约。
服务契约,服务契约描述了客户端能够执行的服务操作。
数据契约,数据契约定义了与服务交互的数据类型。
错误契约,错误契约定义了服务抛出的错误,以及服务处理错误和传递错误到客户端的方式。
消息契约,消息契约允许服务直接与消息交互。消息契约可以是类型化的,也可以是非类型化的。要求使用消息契约则意味着要自定义应用程序上下文,这样就可以通过使用自定义消息头来实现。

服务契约

ServiceContractAttribute定义如下:

[AttributeUsage(AttributeTargets.Interface | AttributeTargets.Class, Inherited = false)]
public sealed class ServiceContractAttribute : Attribute
{
    public String Name { get; set; }
    public String Namespace { get; set; }
    //更多成员
}

ServiceContract特性可以将一个CLR接口映射为与技术无关的服务契约,该特性公开了CLR接口(或者类)作为WCF契约。WCF契约与类型的访问限定无关。面向服务的一个原则是服务边界应该明确
类型的所有成员也不一定就是契约中的一部分。我们必须使用OperationContractAttribute特性显式地标明那些方法需要暴露为WCF契约中的一部分。OperationContractAttribute定义如下:

[AttributeUsage(AttributeTargets.Method)]
public sealed class OperationContractAttribute : Attribute
{
    public String Name { get; set; }
    //更多成员
}

服务类还有一些实现上的约束。我们要避免使用带参构造函数,因为WCF只能使用默认构造函数。同样,虽然类可以使用内部的属性、索引器以及静态成员,但WCF客户端却无法访问它们。

名称与命名空间

可以为契约定义命名空间。契约的命名空间具有与.NET编程相同的目的:确定契约的类型范围,以降低类型的冲突几率。

托管

WCF服务类不能凭空存在。每个WCF服务都必须托管(host)在Windows进程中,该进程被称为宿主进程(Host Process)。单个宿主进程可以托管多个服务,而相同的服务类型也能够托管在多个宿主进程中。
自托管
需要确定客户端与服务之间的进程(或机器)边界时;使用进程内托管,即服务于客户端处于相同进程中时。
托管应用程序的配置文件通常会列出所有希望托管和公开的服务类型

<system.serviceModel>
    <services>
        <service name = "Namespace.Service">
        ...
        </service>
    </services>
</system.serviceModel>

此外,宿主进程必须在运行时显式地注册服务类型,同时为客户端的调用打开宿主,因此我们才要求宿主进程必须在客户端调用到达之前运行。
创建宿主的方法通常是在Main()方法中调用ServiceHost类。
创建ServiceHost对象时,需要为ServiceHost的构造函数提供服务类型,至于默认的基地址则是可选的。
每个ServiceHost实例都与特定的服务类型相关,如果宿主进程需要运行多个服务类型,则必须创建与之匹配的多个ServiceHost实例。在宿主程序中,通过调用Open()方法,可以允许调用传入;通过调用Close()方法终结宿主实例,完成进程中的调用。
ServiceHost实现的ICommunicationObject接口定义了一些高级特性

public interface ICommunicationObject
{
    void Open();
    void Close();
    void Abort();

    event EventHandler Closed;
    event EventHandler Closing;
    event EventHandler Faulted;
    event EventHandler Opened;
    event EventHandler Opening;

    IAsyncResult BeginClose(AsyncCallBack callback, Object state);
    IAsyncResult BeginOpen(AsyncCallBack callback, Object state);
    void EndClose(IAnsycResult result);
    void EndOpen(IAnsycResult result);

    CommunicationState State { get; }
}
public enum CommunicationState
{
    Created,
    Opening,
    Opened,
    Closing,
    Closed,
    Faulted
}

ServiceHost< T >类
ServiceHost< T >类能够改进WCF提供的ServiceHost类。

public class ServiceHost<T> : ServiceHost
{
    public ServiceHost() : base(typeof(T)) {}
    public ServiceHost(params String[] baseAddresses) : base(typeof(T), baseAddresses)) {}
    public ServiceHost(params Uri[] baseAddresses)) : base(typeof(T), baseAddresses)) {}
    static Uri[] Convert(String[] baseAddresses)
    {
        Converter<String, Uri> convert = (address) => { return new Uri(address); };
        return baseAddresses.ConvertAll(convert);
    }
}

绑定

服务之间的通信方式是多种多样的,有多种可能的通信模式。
同步的请求/应答消息,或者异步的“即发即弃”消息;
双向消息;
即时消息或队列消息;
持久队列或者可变队列。
针对消息有许多可能的传输协议。同时还包括一些可能的消息编码格式:纯文本编码格式;二进制编码格式;MTOM编码格式。
消息的安全保障多种策略:不实施任何安全策略;只提供传输层的安全策略;消息曾的隐私保护与安全策略。WCF还包括多种对客户端认证与授权的安全策略。
一个绑定封装了诸如传输协议、消息编码、通信模式、可靠性、安全性、事物传播以及互操作性等相关选项的集合,使得他们保持一致。理想状态下,我们希望将所有繁杂的基础功能模块从服务代码中解放出来,允许服务只需要关注业务逻辑的实现。绑定使得开发者能够基于不同的基础功能模块使用相同的服务逻辑。

常用绑定

基本绑定由BasicHttpBinding类提供。基本绑定能够将WCF服务公开为传统的ASMX Web服务,使得旧的客户端能够与新的服务协作。基本绑定使得你的服务看起来像是一个传统的Web服务,能够基于基本的Web服务信息进行通信。
TCP绑定由NetTcpBinding类提供。TCP绑定使用TCP协议实现在Internet中跨机器的通信。TCP绑定支持多种特性,包括可靠性、事务性、安全性以及WCF之间通信的优化。前提是,它要求客户端与服务都必须使用WCF。
IPC绑定由NetNamedPipeBinding类提供。它使用命名管道为同一机器的通信进行传输。这种绑定方式最安全,因为它不能接收来自机器外部的调用。它同时也是性能最佳的绑定,因为IPC协议比TCP更加轻型。
Web服务(WS)绑定由WSHTTPBinding类提供。WS绑定使用HTTP或者HTTPS进行传输,为基于Internet的通信提供了多种特性(诸如可靠性、事务性与安全性),这些特性均遵循WS-*标准。
WS双向绑定由WSDualHttpBinding类提供。WS双向绑定于WS绑定相似,但它还支持从服务到客户端的双向通信。对于回调的设置没有行业标准,因此WSDualHttpBinding并不具有互操作性。
MSMQ绑定由NetMsmqBinding类提供。使用MSMQ进行传输,用以提供对断开的队列调用的支持。

名字传输协议编码格式互操作性
BasicHttpBindingHTTP/HTTPSText,MTOMYes
NetTcpBindingTCPBinaryNo
NetNamedPipeBindingIPCBinaryNo
WSHttpBindingHTTP/HTTPSText,MTOMYes
WSDualHttpBindingHTTPText,MTOMNo
NetMsmqBindingMSMQBinaryNo

终结点

服务与地址、绑定以及契约有关。其中,地址定义了服务的位置,绑定定义了服务通信的方式,契约则定义了服务的内容。终结点就是地址、契约与绑定的混成品。
地址就是类型虚拟表的内存地址,绑定则是CLR,而契约则代表接口本身。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值