public void InitializeInstanceContext(InstanceContext instanceContext, Message message, IContextChannel channel) { try { ActorId actorId = GenericContext <ActorId> .Current.Value; Guid instanceId = Guid.Empty; if (message.Headers.Action.Contains("Activate") == false) { OperationDescription operation = instanceContext.Host.Description.Endpoints.SelectMany(endpoint => endpoint.Contract.Operations).FirstOrDefault(description => description.Name.Equals(message.Headers.Action.Split('/').Last())); if (operation.IsInitiating == false) { throw new InvalidOperationException("Actor instance previously completed. Cannot use operation '" + operation.TaskMethod.Name + "' to activate new Actor state because it is marked as IsInitiating = false."); } } m_PreviousProvider.InitializeInstanceContext(instanceContext, message, channel); instanceId = GetNewInstanceIdFromMessage(message); if (instanceId.Equals(Guid.Empty) == false) { InitializingContext.Add(message.Headers); SaveActorState(actorId, instanceId, instanceContext.Host.Description.ServiceType); } } finally { m_InstanceAccess.ReleaseMutex(); } }
internal void Initialize(InstanceContext instanceContext) { OperationContext current = OperationContext.Current; Message message = (current != null) ? current.IncomingMessage : null; if (current != null && current.InternalServiceChannel != null) { IContextChannel transparentProxy = (IContextChannel)current.InternalServiceChannel.Proxy; instanceContextProvider.InitializeInstanceContext(instanceContext, message, transparentProxy); } for (int i = 0; i < initializers.Length; i++) { initializers[i].Initialize(instanceContext, message); } }