WCF学习笔记(三)WCF基础

1.地址(Address)

在WCF中,每一个服务都有唯一的地址。

WCF支持下列传输样式

  • HTTP/HTTPS
  • TCP
  • IPC
  • Peer network
  • MSMQ
  • Service bus

地址通信通常采用以下格式:

[基地址]/[可选的URI]

基地址通常采用以下格式:

[传输协议]://[机器名或域名][:可选端口]

下面是一些地址的示例:

http://localhost:8001

http://localhost:8001/MyService

net.tcp://localhost:8002/MyService

net.pipe://localhost/MyPipe

net.msmq://localhost/private/MyQueue

  传输协议 默认端口 示例
TCP地址 net.tcp 808 net.tcp://localhost:8002/MyService
HTTP地址 http,https http(80),https(443) http://localhost:8001
IPC地址 net.pipe   net.pipe://localhost/Mypipe
MSMQ地址 net.msmq   net.msmq://localhost/private/MyService
服务总线地址 sb,http,https   sb://MyNamespace.servicebus.window.net/
       

几种传输协议的特点

a.HTTP/HTTPS

HTTP提供简单的请求-回复(Request-Response)消息传输方式

HTTP是无状态的,每次HTTP请求都是相互独立的

HTTP是无连接的,基于HTTP的数据传输无须事先打开连接

b.Net.TCP

TCP是基于连接的传输协议,在开始进行数据传输之前,通过客户端和服务器之间的3次握手创建连接;在结束传输之后,通过4次握手终止连接

TCP是有状态的,由于数据传输在一个确定的连接中进行,因此可以保持每次数据传输的状态

TCP支持全双工通信,一旦连接成功创建,数据就可以在两个方向上同时传输。

TCP支持可靠通信,IP协议本身提供的数据传输是不可靠的,数据的可靠性只能通过TCP来保证。

c.Net.Pipe

命名管道是windows平台及UNIX系统下实现跨进程通信的标准实现方式,WCF只将命名管道专门用于同一台机器的跨进程通信。所以基于命名管道的URI的主机名,域名,IP地址部分只能是本机的机器名,localhost或127.0.0.1

d.Net.Msmq

即消息队列

2.契约(Contracts)

WCF的所有服务都会公开为契约(Contracts)。契约与平台无关,是描述功能的标准方式。WCF定义的契约有以下四种类型。

  • 服务契约(Service Contracts)

服务契约描述了客户端能够执行的服务操作。

只有接口和类可以标记为Servicecontract属性。

契约与类型的访问限定无关。

类型的所有成员也不一定就是契约的一部分。必须使用OperationContractAttribute属性显著标明哪些方法需要暴露为WCF契约中的一部分。

WCF只允许将OperationContract属性标记到方法上。

契约操作不能使用引用对象参数,只允许使用基本类型或者数据契约。

[ServiceContract]
    interface IMyContract
    {
        [OperationContract]
        string MyMethod(string text);

        //不会成为契约的一部分
        string MyOtherMethod(string text);
    }

class MyService:IMyContract
    {
        public string MyMethod(string text)
        {
            return "Hello" + text;
        }

        public string MyOtherMethod(string text)
        {
            return "Hello" + text;
        }
    }

 还有WCF允许直接将ServiceContract属性标记到服务类上,但我们应该尽量避免,这样有利于在不同的场景下使用契约。

服务契约的默认命名空间是Http://tempuri.org,也可以自定义命名空间。

默认情况下,契约公开的名称就是接口名,也可以使用Name属性定义别名。

类似的,操作公开的名称就是方法名,同样也可以用Name属性定义别名。

[ServiceContract(Namespace="MyNameSpace",Name="IMy")]
    interface IMyContract
    {
        [OperationContract(Name="Method")]
        string MyMethod(string text);

        //不会成为契约的一部分
        string MyOtherMethod(string text);
    }
  • 数据契约(Data Contract)

数据契约定义了与服务交互的数据类型。

  • 错误契约(Fault Contract)

错误契约定义了服务抛出的错误,以及服务处理错误和传递错误到客户端的方式。

  • 消息契约(Message Contract)

消息契约允许服务直接与消息交互,可以是类型化的,也可以是非类型化的。

原文地址:https://www.cnblogs.com/HelloMyWorld/p/3048945.html