internal DispatchRuntime(ClientRuntime proxyRuntime, SharedRuntimeState shared) : this(shared) { this.proxyRuntime = proxyRuntime ?? throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull(nameof(proxyRuntime)); instanceProvider = new CallbackInstanceProvider(); channelDispatcher = new ChannelDispatcher(shared); instanceContextProvider = InstanceContextProviderBase.GetProviderForMode(InstanceContextMode.PerSession, this); Fx.Assert(!shared.IsOnServer, "Client constructor called on server?"); }
internal bool CanUnload(InstanceContext instanceContext) { if (InstanceContextProviderBase.IsProviderSingleton(instanceContextProvider)) { return(false); } if (InstanceContextProviderBase.IsProviderPerCall(instanceContextProvider) || InstanceContextProviderBase.IsProviderSessionful(instanceContextProvider)) { return(true); } //User provided InstanceContextProvider. Call the provider to check for idle. if (!instanceContextProvider.IsIdle(instanceContext)) { instanceContextProvider.NotifyIdle(InstanceContext.NotifyIdleCallback, instanceContext); return(false); } return(true); }
void TransferChannelFromPendingList(MessageRpc rpc) { if (rpc.Channel.IsPending) { rpc.Channel.IsPending = false; ChannelDispatcher channelDispatcher = rpc.Channel.ChannelDispatcher; IInstanceContextProvider provider = InstanceBehavior.InstanceContextProvider; if (!InstanceContextProviderBase.IsProviderSessionful(provider) && !InstanceContextProviderBase.IsProviderSingleton(provider)) { IChannel proxy = rpc.Channel.Proxy as IChannel; if (!rpc.InstanceContext.IncomingChannels.Contains(proxy)) { channelDispatcher.Channels.Add(proxy); } } // TODO: Do we need to keep track of pending channels with the new hosting model? //channelDispatcher.PendingChannels.Remove(rpc.Channel.Binder.Channel); } }
internal MessageRpc(RequestContext requestContext, Message request, DispatchOperationRuntime operation, ServiceChannel channel, ServiceHostBase host, ChannelHandler channelHandler, bool cleanThread, OperationContext operationContext, InstanceContext instanceContext /*, EventTraceActivity eventTraceActivity*/) { Fx.Assert((operationContext != null), "correwcf.Dispatcher.MessageRpc.MessageRpc(), operationContext == null"); // TODO: ChannelHandler supplied an ErrorHandler, need to supply this some other way. //Fx.Assert(channelHandler != null, "System.ServiceModel.Dispatcher.MessageRpc.MessageRpc(), channelHandler == null"); //this.Activity = null; //this.EventTraceActivity = eventTraceActivity; AsyncResult = null; TaskResult = null; CanSendReply = true; Channel = channel; this.channelHandler = channelHandler; Correlation = EmptyArray.Allocate(operation.Parent.CorrelationCount); DidDeserializeRequestBody = false; Error = null; ErrorProcessor = null; FaultInfo = new ErrorHandlerFaultInfo(request.Version.Addressing.DefaultFaultAction); HasSecurityContext = false; Host = host; Instance = null; AsyncProcessor = null; NotUnderstoodHeaders = null; Operation = operation; OperationContext = operationContext; paused = false; ParametersDisposed = false; Request = request; RequestContext = requestContext; RequestContextThrewOnReply = false; SuccessfullySendReply = false; RequestVersion = request.Version; Reply = null; ReplyTimeoutHelper = new TimeoutHelper(); SecurityContext = null; InstanceContext = instanceContext; SuccessfullyBoundInstance = false; SuccessfullyIncrementedActivity = false; SuccessfullyLockedInstance = false; switchedThreads = !cleanThread; //this.transaction = null; InputParameters = null; OutputParameters = null; ReturnParameter = null; isInstanceContextSingleton = InstanceContextProviderBase.IsProviderSingleton(Channel.DispatchRuntime.InstanceContextProvider); invokeContinueGate = null; if (!operation.IsOneWay && !operation.Parent.ManualAddressing) { RequestID = request.Headers.MessageId; ReplyToInfo = new RequestReplyCorrelator.ReplyToInfo(request); } else { RequestID = null; ReplyToInfo = new RequestReplyCorrelator.ReplyToInfo(); } //if (DiagnosticUtility.ShouldUseActivity) //{ // this.Activity = TraceUtility.ExtractActivity(this.Request); //} //if (DiagnosticUtility.ShouldUseActivity || TraceUtility.ShouldPropagateActivity) //{ // this.ResponseActivityId = ActivityIdHeader.ExtractActivityId(this.Request); //} //else //{ ResponseActivityId = Guid.Empty; //} //if (this.EventTraceActivity == null && FxTrace.Trace.IsEnd2EndActivityTracingEnabled) //{ // if (this.Request != null) // { // this.EventTraceActivity = EventTraceActivityHelper.TryExtractActivity(this.Request, true); // } //} }