public void ListenForEvents(ServiceEnvironmentEventType eventType) { if (_eventListener == null) { _eventListener = new WcfHost(this, this); ServiceEndpoint[] rawEndpoints = _eventListener.Description.Endpoints.ToArray(); _eventListener.Description.Endpoints.Clear(); foreach (ServiceEndpoint endpoint in rawEndpoints) { endpoint.Address = new EndpointAddress(new Uri(endpoint.Address.Uri.ToString().Replace("{guid}", Guid.NewGuid().ToString("N")))); _eventListener.AddServiceEndpoint(endpoint); } _eventListener.Open(); } var env = this.EnvironmentConfiguration; using (var connection = new SqlConnection(env.ConnectionString)) { // FUTURE: in the future save all endpoints to DB var command = new SqlCommand(env.SP_EnvironmentEventRegister, connection); command.CommandType = CommandType.StoredProcedure; command.Parameters.AddWithValue("@eventType", eventType.ToString()); command.Parameters.AddWithValue("@endpointName", _eventListener.Description.Endpoints.First(endpoint => endpoint.Name == typeof(ServiceEnvironment).FullName).Name); command.Parameters.AddWithValue("@endpointAddress", _eventListener.Description.Endpoints.First(endpoint => endpoint.Name == typeof(ServiceEnvironment).FullName).Address.ToString()); connection.Open(); command.ExecuteNonQuery(); } }
// ======================== #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 }
// ------------------------------ 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(); }