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();
            }
        }
예제 #2
0
        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);
            }
        }