中篇
5.托管于宿主
6.消息模式
7.WCF行为-实例管理和并发控制
8.安全
5.托管于宿主
托管
宿主Host
Ø承载WCF Service运行的环境
自承载方式
系统服务方式
IIS方式
WAS
建立Winform宿主
关键代码
ServiceHost host = new ServiceHost(service Type );
host.Open();
1 private void button1_Click(object sender, EventArgs e) 2 { 3 4 System.ServiceModel.ServiceHost myhost = new System.ServiceModel.ServiceHost(typeof(WeatherInfoService.WeatherInfoService)); 5 6 try 7 { 8 myhost.Open(); 9 10 this.textBox1.AppendText(myhost.State.ToString() + " 已经启动" + DateTime.Now); 11 } 12 catch (Exception) 13 { 14 this.textBox1.AppendText(" 启动错误" + DateTime.Now); 15 } 16 17 18 System.Threading.Thread.Sleep(5000); 19 20 try 21 { 22 myhost.Close(); 23 this.textBox1.AppendText(myhost.State.ToString() + " 已经Close" + DateTime.Now); 24 } 25 catch (Exception) 26 { 27 this.textBox1.AppendText(" 启动错误" + DateTime.Now); 28 } 29 }
宿主代码
6.消息模式
消息模式
Ø 客户端与服务器之间是进行消息通讯的方式
三种主要消息模式
Ø 单向 One Way
Ø 请求/答复Request/Reply
Ø 双工Duplex
消息模式-单向模式
单向模式
Ø One Way Call
Ø 指的是发送端负责把消息发送给对方并且收到本地发出信息的确认消息之后,就完成交互的方式。
特点
Ø 未知:消息是否最终到达服务的终节点
Ø 已知:消息发送成功
Ø 一般只能为返回void 的操作指定单向消息交换
Ø Operation Contract Attribute的IsOneWay 属性需要设置为True,默认为false.
[OperationContract(IsOneWay=true)]
void Method();
操作协定中可以有很多参数标记,如下图:
消息模式-请求/答复模式
请求/答复模式
Ø Request/Reply
Ø 客户端发送一个消息并且接收一个返回消息来完成一次交互
特点
Ø 请求方(客户端应用程序)发出请求以后,一直等待对方(WCF方)答复。
Ø 这是默认的模式
[OperationContract]
void Method();
消息模式-双工模式
双工模式
Ø duplex
Ø 客户端和服务端都可以任意地向对方发送消息,而对方也可以以任意的次序来接收消息。
Ø 服务端 :
1 需要设计用于回调的服务协定,
1 public interface IChatCallBack 2 { 3 [OperationContract(IsOneWay = true)] 4 void Receive(string name, string msg); 5 6 [OperationContract(IsOneWay = true)] 7 void ReceiveWhisper(string name, string msg); 8 9 [OperationContract(IsOneWay = true)] 10 void UserEnter(string name); 11 12 [OperationContract(IsOneWay = true)] 13 void UserLeave(string name); 14 15 [OperationContract(IsOneWay = true)] 16 void LoadUsers(List<string> chaters); 17 18 }
2 将该回调协定的类型分配给ServiceContractAttribute Attribute的CallbackContract property。
在服务接口的上面添加属性标签
Ø客户端:
1 要对该接口实现
功能设计:
Ø 1 客户端调用服务端发送心跳通知
Ø 2服务端回调,调整心跳频率
主要代码
public interface ICallBack
{
[OperationContract(IsOneWay = true )]
void ChangeInterval(int seconds);
}
[ServiceContract(CallbackContract=typeof(ICallBack ))]
public interface IService1
{
[OperationContract]
void Heartbeat();
}
WCF Behanior
什么是Behavior
Ø Behavior即各种影响WCF系统运行的设置。
Ø 包括服务行为(Service Behavior)和操作行为(Operation Behavior)
Ø 服务行为作用在终节点上(实例控制、并发控制、元数据发布等)
Ø 操作行为作用于某一服务操作上(事务流设置等。
主要的Behavior
Ø 实例管理
Ø 并发管理
Ø 元数据发布管理
Ø 事务
7.WCF行为-实例管理和并发控制
两个只要的服务行为:
实例管理
如何为不同的Client生成Service instance,以及何时销毁instance
有个重要的枚举上已经介绍的比较清楚了:
namespace System.ServiceModel { // 摘要: // 指定可用来处理包含在传入消息中的调用的服务实例数。 public enum InstanceContextMode { // 摘要: // 为每个会话创建一个新的 System.ServiceModel.InstanceContext 对象。 PerSession = 0, // // 摘要: // 新的 System.ServiceModel.InstanceContext 对象在每次调用前创建,在调用后回收。如果信道未创建会话,则该值的行为就如同 // System.ServiceModel.InstanceContextMode.PerCall 一样。 PerCall = 1, // // 摘要: // 只有一个 System.ServiceModel.InstanceContext 对象用于所有传入呼叫,并且在调用后不回收。如果服务对象不存在,则创建一个。 Single = 2, } }
WCF 实例管理的枚举
修饰服务类
ServiceBehavior特性,InstanceContextMode属性
并发管理
多线程
同样也有一个重要枚举:
namespace System.ServiceModel { // 摘要: // 指定服务类是支持单线程还是多线程操作模式。 public enum ConcurrencyMode { // 摘要: // 服务实例是单线程的,且不接受可重入调用。如果 System.ServiceModel.ServiceBehaviorAttribute.InstanceContextMode // 属性为 System.ServiceModel.InstanceContextMode.Single,且其他消息在实例处理调用的同时到达,则这些消息必须等待,直到服务可用或消息超时为止。 Single = 0, // // 摘要: // 服务实例是单线程的,且接受可重入调用。可重入服务接受在调用其他服务的同时进行调用;因此在调出之前,您需要负责让对象的状态一致,而在调出之后,必须确认本地操作数据有效。请注意,只有通过 // WCF 通道调用其他服务,才能解除服务实例锁定。在此情况下,已调用的服务可以通过回调重入第一个服务。如果第一个服务不可重入,则该调用顺序会导致死锁。有关详细信息,请参见 // System.ServiceModel.ServiceBehaviorAttribute.ConcurrencyMode。 Reentrant = 1, // // 摘要: // 服务实例是多线程的。无同步保证。因为其他线程可以随时更改服务对象,所以必须始终处理同步与状态一致性。 Multiple = 2, } }
WCF 并发管理的枚举
8.安全
安全控制
Ø 消息完整性
Ø 消息保密性
Ø 身份认证
WCF 安全- Transfer Security Mode
Transfer Security
Ø 保证消息完整性
Ø 保证消息保密性
1.None: 不采取任何安全措施,仅适合在内部安全环境使用。
2.Transport: 在传输协议级别上对通道的所有通讯进行加密,可使用的通讯协议包括 HTTPS、TCP、IPC 和 MSMQ。
3.Message: 通过相关标准(如 WS-Security)直接对消息进行加密。
4.Mixed(TransportWithMessageCredential): 混合了上面两种方式。使用 Transport 方式完成消息完整性、消息机密性以及服务器认证,而使用 Message 方式完成客户端认证。
5.Both: 使用 Transport 和 Message 共同完成所有的安全过程,,性能低下,只有 NetMsmqBinding 支持这一安全方式。
常用的配置方式是在配置文件中进行配置:
<bindings>
<netTcpBinding>
<binding name = “MyBinding">
<security mode = "Message" />
</binding>
</netTcpBinding>
</bindings>
WCF安全模式与绑定协议的搭配
WCF身份验证机制
身份验证机制 与Transfer mode的搭配
与Transport Transfer Mode的搭配
直接在配置文件中进行配置就可以:
以上信息数据来源可能是两年前的,没时间去整理新的就先使用了老的数据做简单梳理了。。。如果有任何问题请大家留言帮忙修正!谢谢!