internal ServiceInstance(ServiceConfiguration configuration, ServiceEnvironment environment, ServiceInstance parentInstance)
        {
            if (configuration == null)
            {
                throw new ArgumentNullException("configuration");
            }

            if (configuration.ConfigurationLevel == ServiceConfigurationLevel.Instance)
            {
                throw new ArgumentException("Cannot use an existing instance-level configuration to create a new instance. Use instance.Configuration.GetBaseConfiguration(..) instead.", "configuration");
            }

            ThrowExceptionOnError = false;

            this.Environment = environment;
            this.InstanceID  = Guid.NewGuid();
            if (parentInstance != null)
            {
                this.Configuration  = configuration.Derive(ServiceConfigurationLevel.Instance, parentInstance.Configuration);
                this.ParentInstance = parentInstance;
            }
            else
            {
                this.Configuration = configuration.Derive(ServiceConfigurationLevel.Instance, null);
            }

            if (String.IsNullOrEmpty(this.Configuration.HostName))
            {
                this.Configuration.HostName = Environment.EnvironmentConfiguration.DefaultHostName;
            }

            //((ILockable)this.Configuration).Lock();
        }
예제 #2
0
 internal ServiceConnection(ServiceEnvironment environment, Guid serviceInstanceID, string endpointName, string endpointAddress)
 {
     this.Guid = Guid.NewGuid();
     this.ServiceInstanceID = serviceInstanceID;
     this.HostChannel       = new WcfDuplexClient <IServiceExecutionHost>(environment, this, endpointName, endpointAddress);
     //TODO: add environment to StreamingContext
     this.HostChannel.Open();
     this.HostChannel.Channel.Connect(this.ServiceInstanceID, this.Guid);
 }
예제 #3
0
 internal ServiceConnection(ServiceEnvironment environment, Guid serviceInstanceID, string endpointName, string endpointAddress)
 {
     Guid = Guid.NewGuid();
     ServiceInstanceID    = serviceInstanceID;
     EnvironmentUsageName = environment.UsageName;
     HostChannel          = new WcfDuplexClient <IServiceExecutionHost>(environment, this, endpointName, endpointAddress);
     //TODO: add environment to StreamingContext
     HostChannel.Open();
     HostChannel.Channel.Connect(ServiceInstanceID, Guid, EnvironmentUsageName);
 }
        // ========================
        #endregion

        #region Methods
        // ========================

        public ServiceExecutionHost(string name, ServiceEnvironment environment)
        {
            ServiceExecutionPermission.All.Demand();

            this.HostName    = name;
            this.HostGuid    = Guid.NewGuid();
            this.Environment = environment;

            this.WcfHost = new WcfHost(this.Environment, this);

            ServiceEndpoint[] rawEndpoints = this.WcfHost.Description.Endpoints.ToArray();
            this.WcfHost.Description.Endpoints.Clear();
            foreach (ServiceEndpoint endpoint in rawEndpoints)
            {
                endpoint.Address = new EndpointAddress(new Uri(endpoint.Address.Uri.ToString().Replace("{hostName}", name)));
                this.WcfHost.AddServiceEndpoint(endpoint);
            }

            this.Environment.RegisterHost(this);

            // Open the listener
            WcfHost.Open();

            // Start the logger
            Edge.Core.Utilities.Log.Start();

            #region Code Access Security (disabled)

            /*
             *
             * // Move following line outside this function
             * // PermissionSet _servicePermissions;
             *
             * _servicePermissions = new PermissionSet(PermissionState.None);
             * _servicePermissions.AddPermission(new ServiceExecutionPermission(ServiceExecutionPermissionFlags.None));
             * _servicePermissions.AddPermission(new System.Security.Permissions.FileIOPermission(PermissionState.Unrestricted));
             * _servicePermissions.AddPermission(new System.Security.Permissions.ReflectionPermission(PermissionState.Unrestricted));
             * _servicePermissions.AddPermission(new System.Security.Permissions.SecurityPermission(
             *      SecurityPermissionFlag.Assertion |
             *      SecurityPermissionFlag.Execution |
             *      SecurityPermissionFlag.ControlAppDomain |
             *      SecurityPermissionFlag.ControlThread |
             *      SecurityPermissionFlag.SerializationFormatter
             * ));
             */
            #endregion
        }
        public WcfDuplexClient(ServiceEnvironment environment, ServiceConnection connection, string endpointName, string endpointAddress)
            : base(new InstanceContext(connection), endpointName, endpointAddress)
        {
            foreach (OperationDescription description in this.Endpoint.Contract.Operations)
            {
                DataContractSerializerOperationBehavior dcsOperationBehavior = description.Behaviors.Find <DataContractSerializerOperationBehavior>();

                if (dcsOperationBehavior != null)
                {
                    description.Behaviors.Remove(dcsOperationBehavior);
                    description.Behaviors.Add(new NetDataContractOperationBehavior(description)
                    {
                        StreamingContextObject = environment
                    });
                }
            }
        }
        // ------------------------------

        internal ServiceEnvironmentEventListener(ServiceEnvironment environment, ServiceEnvironmentEventType[] eventTypes)
        {
            this.ListenerID  = Guid.NewGuid();
            this.Environment = environment;
            this.EventTypes  = eventTypes;
            this.WcfHost     = new WcfHost(environment, this);

            ServiceEndpoint[] rawEndpoints = WcfHost.Description.Endpoints.ToArray();
            WcfHost.Description.Endpoints.Clear();
            foreach (ServiceEndpoint endpoint in rawEndpoints)
            {
                endpoint.Address = new EndpointAddress(new Uri(endpoint.Address.Uri.ToString().Replace("{guid}", this.ListenerID.ToString("N"))));
                WcfHost.AddServiceEndpoint(endpoint);
            }

            WcfHost.Open();
        }
        internal static ServiceInstance FromSqlData(IDataRecord record, ServiceEnvironment environment, ServiceInstance childInstance, bool stateInfoOnly)
        {
            ServiceInstance instance = new ServiceInstance()
            {
                InstanceID  = record.Convert <string, Guid>("InstanceID", raw => Guid.Parse(raw)),
                Environment = environment,
                StateInfo   = new ServiceStateInfo()
                {
                    Progress        = record.Get <double>("Progress"),
                    State           = record.Get <ServiceState>("State"),
                    Outcome         = record.Get <ServiceOutcome>("Outcome"),
                    TimeInitialized = record.Get <DateTime>("TimeInitialized"),
                    TimeStarted     = record.Get <DateTime>("TimeStarted"),
                    TimeEnded       = record.Get <DateTime>("TimeEnded"),
                    TimeLastPaused  = record.Get <DateTime>("TimeLastPaused"),
                    TimeLastResumed = record.Get <DateTime>("TimeLastResumed")
                }
            };

            if (!stateInfoOnly)
            {
                instance.SchedulingInfo = record.IsDBNull("Scheduling_Status", "Scheduling_Scope", "Scheduling_MaxDeviationBefore", "Scheduling_MaxDeviationAfter", "Scheduling_RequestedTime", "Scheduling_ExpectedStartTime", "Scheduling_ExpectedEndTime") ? null : new SchedulingInfo()
                {
                    SchedulingStatus   = record.Get <SchedulingStatus>("Scheduling_Status"),
                    SchedulingScope    = record.Get <SchedulingScope>("Scheduling_Scope"),
                    MaxDeviationBefore = new TimeSpan(0, 0, (int)record.Get <long>("Scheduling_MaxDeviationBefore")),
                    MaxDeviationAfter  = new TimeSpan(0, 0, (int)record.Get <long>("Scheduling_MaxDeviationAfter")),
                    RequestedTime      = record.Get <DateTime>("Scheduling_RequestedTime"),
                    ExpectedStartTime  = record.Get <DateTime>("Scheduling_ExpectedStartTime"),
                    ExpectedEndTime    = record.Get <DateTime>("Scheduling_ExpectedEndTime"),
                };

                var stringReader = new StringReader(record.Get <String>("Configuration"));
                using (var xmlReader = new XmlTextReader(stringReader))
                    instance.Configuration = (ServiceConfiguration) new NetDataContractSerializer().ReadObject(xmlReader);
            }

            if (childInstance != null)
            {
                childInstance.ParentInstance = instance;
            }

            return(instance);
        }
예제 #8
0
        public WcfHost(ServiceEnvironment environment, object singletonInstance) : base(singletonInstance)
        {
            _environment = environment;

            foreach (ServiceEndpoint endpoint in this.Description.Endpoints)
            {
                foreach (OperationDescription description in endpoint.Contract.Operations)
                {
                    DataContractSerializerOperationBehavior dcsOperationBehavior = description.Behaviors.Find <DataContractSerializerOperationBehavior>();

                    if (dcsOperationBehavior != null)
                    {
                        description.Behaviors.Remove(dcsOperationBehavior);
                        description.Behaviors.Add(new NetDataContractOperationBehavior(description)
                        {
                            StreamingContextObject = _environment
                        });
                    }
                }
            }
        }
예제 #9
0
        internal void Init(ServiceExecutionHost host, ServiceEnvironmentConfiguration envConfig, ServiceConfiguration config, SchedulingInfo schedulingInfo, Guid instanceID, Guid parentInstanceID)
        {
            Host             = host;
            this.Environment = ServiceEnvironment.Open("Service", envConfig);

            this.InstanceID     = instanceID;
            this.Configuration  = config;
            this.SchedulingInfo = schedulingInfo;

            if (parentInstanceID != Guid.Empty)
            {
                this.ParentInstance = Environment.GetServiceInstance(parentInstanceID);
            }

            Current = this;

            // Monitor app domain-level events
            AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(this.DomainUnhandledException);
            AppDomain.CurrentDomain.DomainUnload       += new EventHandler(this.DomainUnload);

            StateInfo.TimeInitialized = DateTime.Now;
            StateInfo.State           = ServiceState.Ready;
            NotifyState();
        }