WCF学习(1) 一个简单的WCF程序
基本概念
Windows Communication Foundation是由微软开发的一系列支持数据通信的应用程序框架.其部分基本概念如下:
终结点
终结点是用来发送或接收消息(或同时执行这两种操作)的构造。终结点包括一个定义消息可以发送到的目的地的位置(地址)、一个描述消息应如何发送的通信机制规范(绑定),以及对可以在该位置发送或接收(或同时执行这两种操作)的一组消息的定义(服务协定,用于描述可以发送哪些消息)。 WCF 服务作为一个终结点集合对外公开
地址
指定接收消息的位置。它以统一资源标识符 (URI) 的形式指定。URI 架构部分指定用于到达地址的传输机制,如 HTTP 和 TCP。URI 的层次结构部分包含一个唯一的位置,其格式取决于传输机制。
行为
行为是控制服务、终结点、特定操作或客户端的各个运行时方面的要素。行为按照范围进行分组:常见行为在全局范围内影响所有终结点,服务行为仅影响与服务相关的方面,终结点行为仅影响与终结点相关的属性,操作级行为影响特定操作。例如,有一种服务行为是遏制,它指定当过多的消息可能超出服务的处理能力时,服务应该如何反应。另一方面,终结点行为仅控制与终结点相关的方面,如查找安全凭据的方式和位置
服务协定
服务协定将多个相关的操作联系在一起,组成单个功能单元。协定可以定义服务级设置,如服务的命名空间、对应的回调协定以及其他此类设置。在大多数情况下,协定的定义方法是用所选的编程语言创建一个接口,然后将 ServiceContractAttribute 属性应用于该接口。通过实现该接口,可生成实际的服务代码。
服务操作
服务操作是在服务的代码中定义的过程,用于实现某种操作的功能。此操作作为一个 WCF 客户端上的方法向客户端公开。该方法可以返回一个值,并可采用数量可选的参数,或是不采用任何参数且不返回任何响应。例如,一个实现简单的“Hello”的操作可以用作客户端存在通知,并可以开始一系列操作.
第一个例子
服务协定
服务操作
配置文件
<system.serviceModel>
<bindings>
<netTcpBinding>
<binding name="netBinding" maxReceivedMessageSize="1073741824" transferMode="Streamed" />
</netTcpBinding>
</bindings>
<services>
<service name="ConfigServer.SysConfigService" behaviorConfiguration="mexbehavior" >
<endpoint address="SysConfigService"
binding="netTcpBinding"
bindingConfiguration="netBinding"
contract="ConfigServer.ISysConfigService" />
<endpoint address="mex"
binding="mexTcpBinding"
contract="IMetadataExchange" />
<host>
<baseAddresses>
<add baseAddress="net.tcp://localhost:8000/Service" />
</baseAddresses>
</host>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="mexbehavior">
<serviceDebug includeExceptionDetailInFaults="True"/>
<serviceMetadata />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
- ###服务端
使用配置文件
host = new ServiceHost(typeof(SysConfigService));
host.Opened += delegate
{
Console.WriteLine("WCF服务已启动,地址:{0}", string.Format("Address{0}","net.tcp://localhost:8000/Service"));
};
host.Open();
不使用配置文件
NetTcpBinding bind = new NetTcpBinding();
bind.Security.Mode = SecurityMode.None;
bind.MaxReceivedMessageSize = 2147483647;
Uri baseAddress = new Uri(string.Format("net.tcp://{0}:{1}/Service", HostIP, 8000));
if (host == null)
host = new ServiceHost(typeof(SysConfigService), baseAddress);
host.AddServiceEndpoint(typeof(ISysConfigService), bind, "SysConfigService");
if (host.Description.Behaviors.Find<ServiceMetadataBehavior>() == null)
{
host.Description.Behaviors.Add(new ServiceMetadataBehavior());
//暴露出元数据
host.AddServiceEndpoint(typeof(IMetadataExchange), MetadataExchangeBindings.CreateMexTcpBinding(), "mex");
}
if (host.State != CommunicationState.Opened)
{
host.Opened += delegate
{
Console.WriteLine("WCF服务已启动,地址:{0}", string.Format("Address:{0}", baseAddress.AbsoluteUri));
};
host.Open();
}