public static WriteMessageToConsole ( string message ) : void | ||
message | string | |
리턴 | void |
public void InitializeInstanceContext(InstanceContext instanceContext, System.ServiceModel.Channels.Message message, IContextChannel channel) { //Look if the Client has given us a unique ID to add to this InstanceContext int headerIndex = message.Headers.FindHeader(CustomHeader.HeaderName, CustomHeader.HeaderNamespace); String headerId = null; if (headerIndex != -1) { headerId = message.Headers.GetHeader <string>(headerIndex); } if (headerId == null) { //If no header was sent by the Client, then create a new one and assign it to this InstanceContext. headerId = Guid.NewGuid().ToString(); Utility.WriteMessageToConsole(String.Format(ResourceHelper.GetString("NoHeaderFound"))); } Utility.WriteMessageToConsole(String.Format(ResourceHelper.GetString("InstanceContextAddedToCache"), headerId)); //Add this to the Cache this.instanceContextCache[headerId] = instanceContext; //Register the Closing event of this InstancContext so it can be removed from the collection instanceContext.Closing += this.RemoveInstanceContext; IExtension <InstanceContext> customLeaseExtension = new CustomLeaseExtension(timeout, headerId); instanceContext.Extensions.Add(customLeaseExtension); }
/// <summary> /// This implements a PerCall InstanceContextMode behavior. If a cached InstanceContext is not found /// then WCF will create a new one. /// </summary> public InstanceContext GetExistingInstanceContext(System.ServiceModel.Channels.Message message, IContextChannel channel) { //Per Session behavior //To implement a PerSession behavior (If underlyin binding supports it) where in all //methods from one ChannelFactory will be serviced by the same InstanceContext //Check if the incoming request has the InstanceContext id it wants to connect with. if (message.Headers.FindHeader(CustomHeader.HeaderName, CustomHeader.HeaderNamespace) != -1) { String sharingId = message.Headers.GetHeader <string>(CustomHeader.HeaderName, CustomHeader.HeaderNamespace); if (sharingId != null && instanceContextCache.ContainsKey(sharingId)) { Utility.WriteMessageToConsole(String.Format(ResourceHelper.GetString("InstanceContextLookup"), sharingId)); //Retrieve the InstanceContext from the map InstanceContext context = instanceContextCache[sharingId]; if (context != null) { //Before returning, stop the timer on this InstanceContext CustomLeaseExtension extension = context.Extensions.Find <CustomLeaseExtension>(); Utility.WriteMessageToConsole(String.Format(ResourceHelper.GetString("StopInstanceContextIdleTimer"), sharingId)); extension.StopTimer(); Utility.WriteMessageToConsole(ResourceHelper.GetString("CachedInstanceContextFound")); return(instanceContextCache[sharingId]); } } } //No existing InstanceContext was found so return null and WCF will create a new one. return(null); }
/// <summary> /// Timer elapsed event handler. /// </summary> void idleTimer_Elapsed(object sender, ElapsedEventArgs args) { lock (thisLock) { StopTimer(); isIdle = true; Utility.WriteMessageToConsole( ResourceHelper.GetString("MsgLeaseExpired")); callback(owner); } }
public void RemoveInstanceContext(object o, EventArgs args) { InstanceContext context = o as InstanceContext; CustomLeaseExtension extension = context.Extensions.Find <CustomLeaseExtension>(); String id = (extension != null) ? extension.InstanceId : null; if (this.instanceContextCache[id] != null) { Utility.WriteMessageToConsole(String.Format(ResourceHelper.GetString("InstanceContextRemovedFromCache"), id)); this.instanceContextCache.Remove(id); } }
public bool IsIdle(InstanceContext instanceContext) { lock (thisLock) { if (isIdle) { Utility.WriteMessageToConsole( ResourceHelper.GetString("MsgIdle")); } else { Utility.WriteMessageToConsole( ResourceHelper.GetString("MsgNotIdle")); } bool idleCopy = isIdle; isIdle = false; return(idleCopy); } }