标签:
中篇
5.托管于宿主
6.消息模式
7.WCF行为-实例管理和并发控制
8.安全
5.托管于宿主
托管
宿主Host
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 }
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。
在服务接口的上面添加属性标签
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, } }
修饰服务类
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, } }
标签:
原文地址:http://www.cnblogs.com/cyr2012/p/4250688.html