Code:
/ WCF / WCF / 3.5.30729.1 / untmp / Orcas / SP / ndp / cdf / src / WCF / Tools / comsvcutil / ComplusEndpointConfigContainer.cs / 1 / ComplusEndpointConfigContainer.cs
//------------------------------------------------------------------------------ // Copyright (c) Microsoft Corporation. All rights reserved. //----------------------------------------------------------------------------- namespace Microsoft.Tools.ServiceModel.ComSvcConfig { using System; using System.ServiceModel.Channels; using System.Diagnostics; using System.Configuration; using System.Collections; using System.Collections.Specialized; using System.Collections.Generic; using System.IO; using System.Reflection; using System.Text; using System.Threading; using System.Runtime.InteropServices; using System.Security; using System.ServiceModel; using System.ServiceModel.Configuration; using System.ServiceModel.Description; using Microsoft.Tools.ServiceModel; using Microsoft.Tools.ServiceModel.SvcUtil; using System.Transactions; class ComplusEndpointConfigContainer : EndpointConfigContainer { ComAdminAppInfo appInfo; bool closed; // if this container has not yet been asked to commit or abort, operations are still allowed string appDir; bool mustGenerateAppDir; AtomicFile manifestFile; AtomicFile configFile; bool listenerComponentExists; bool hasServices; TransactionScope scope; bool modified = false; ComplusEndpointConfigContainer(ComAdminAppInfo appInfo) { this.appInfo = appInfo; this.scope = null; if (appInfo.ApplicationDirectory != null && appInfo.ApplicationDirectory.Length > 0) { this.appDir = appInfo.ApplicationDirectory; this.mustGenerateAppDir = false; if (!Directory.Exists(this.appDir)) { // We will not tolerate misconfigured COM+ apps (i.e. we wont create the dir for you, which is consistent with what COM+ does throw Tool.CreateException(SR.GetString(SR.ApplicationDirectoryDoesNotExist, appDir), null); } } else { this.appDir = GeneratedAppDirectoryName(); if (!Directory.Exists(this.appDir)) this.mustGenerateAppDir = true; } this.configFile = new AtomicFile(Path.Combine(this.appDir, "application.config")); this.manifestFile = new AtomicFile(Path.Combine(this.appDir, "application.manifest")); this.listenerComponentExists = appInfo.ListenerExists; this.hasServices = listenerComponentExists; // notice how we initialize this } public override bool WasModified { get { return this.modified; } set { this.modified = value; } } internal AtomicFile ConfigFile { get { return this.configFile; } } internal bool ListenerComponentExists { get { return this.listenerComponentExists; } } public override void AbortChanges() { this.closed = true; this.manifestFile.Abort(); this.configFile.Abort(); if (this.mustGenerateAppDir) { // Delete the directory if it exists if (Directory.Exists(this.appDir)) { Directory.Delete(this.appDir); } } if (scope != null) { try { Transaction.Current.Rollback (); scope.Complete (); scope.Dispose (); } catch (Exception ex) { if (ex is NullReferenceException || ex is SEHException) { throw; } ToolConsole.WriteWarning (SR.GetString (SR.FailedToAbortTransactionWithError, ex.Message)); } } } public override void Add(IListendpointConfigs) { ThrowIfClosed(); Configuration config = GetConfiguration(false); // not read only Debug.Assert(config != null, "config != null"); bool anyAdded = false; foreach (EndpointConfig endpointConfig in endpointConfigs) { Debug.Assert(endpointConfig.Appid == this.appInfo.ID, "can't add endpoint for a different application"); bool added = this.BaseAddEndpointConfig(config, endpointConfig); if (added) { anyAdded = true; // the metadata exchange endpoint is not displayed as a regular endpoint if (endpointConfig.Iid == typeof(IMetadataExchange).GUID) { ToolConsole.WriteLine(SR.GetString(SR.MexEndpointAdded)); continue; } if (!Tool.Options.ShowGuids) { ToolConsole.WriteLine(SR.GetString(SR.InterfaceAdded, endpointConfig.ComponentProgID, endpointConfig.InterfaceName)); } else { ToolConsole.WriteLine(SR.GetString(SR.InterfaceAdded, endpointConfig.Clsid, endpointConfig.Iid)); } } else { // the metadata exchange endpoint is not displayed as a regular endpoint if (endpointConfig.Iid == typeof(IMetadataExchange).GUID) { if (!Tool.Options.ShowGuids) ToolConsole.WriteWarning(SR.GetString(SR.MexEndpointAlreadyExposed, endpointConfig.ComponentProgID)); else ToolConsole.WriteWarning(SR.GetString(SR.MexEndpointAlreadyExposed, endpointConfig.Clsid)); } else { if (!Tool.Options.ShowGuids) ToolConsole.WriteWarning(SR.GetString(SR.InterfaceAlreadyExposed, endpointConfig.ComponentProgID, endpointConfig.InterfaceName)); else ToolConsole.WriteWarning(SR.GetString(SR.InterfaceAlreadyExposed, endpointConfig.Clsid, endpointConfig.Iid)); } } } if (anyAdded) { WasModified = true; config.Save(); } this.hasServices = true; } const string defaultBindingType = "netNamedPipeBinding"; const string defaultTransactionBindingType = "netNamedPipeBinding"; const string defaultMexBindingType = "mexNamedPipeBinding"; const string defaultBindingName = "comNonTransactionalBinding"; const string defaultTransactionalBindingName = "comTransactionalBinding"; public override string DefaultBindingType { get { return defaultBindingType; }} public override string DefaultBindingName { get { return defaultBindingName; }} public override string DefaultTransactionalBindingType { get { return defaultTransactionBindingType;} } public override string DefaultTransactionalBindingName { get { return defaultTransactionalBindingName;}} public override string DefaultMexBindingType { get { return defaultMexBindingType;} } public override string DefaultMexBindingName { get { return null;} } void EnsureNetProfileNamedPipeBindingElementBinding(Configuration config) { ServiceModelSectionGroup sg = ServiceModelSectionGroup.GetSectionGroup(config); if (!sg.Bindings.NetNamedPipeBinding.Bindings.ContainsKey(this.DefaultBindingName)) { NetNamedPipeBindingElement bindingConfig; bindingConfig = new NetNamedPipeBindingElement(this.DefaultBindingName); sg.Bindings.NetNamedPipeBinding.Bindings.Add(bindingConfig); } if (!sg.Bindings.NetNamedPipeBinding.Bindings.ContainsKey(this.DefaultTransactionalBindingName)) { NetNamedPipeBindingElement bindingConfig; bindingConfig = new NetNamedPipeBindingElement(this.DefaultTransactionalBindingName); bindingConfig.TransactionFlow = true; sg.Bindings.NetNamedPipeBinding.Bindings.Add(bindingConfig); } } protected override void AddBinding (Configuration config) { EnsureNetProfileNamedPipeBindingElementBinding (config); } void EnsureBindingRemoved (Configuration config) { ServiceModelSectionGroup sg = ServiceModelSectionGroup.GetSectionGroup(config); if (sg.Bindings.NetNamedPipeBinding.Bindings.ContainsKey(this.DefaultBindingName)) { NetNamedPipeBindingElement element = sg.Bindings.NetNamedPipeBinding.Bindings[this.DefaultBindingName]; sg.Bindings.NetNamedPipeBinding.Bindings.Remove (element); } if (sg.Bindings.NetNamedPipeBinding.Bindings.ContainsKey(this.DefaultTransactionalBindingName)) { NetNamedPipeBindingElement element = sg.Bindings.NetNamedPipeBinding.Bindings[this.DefaultTransactionalBindingName]; sg.Bindings.NetNamedPipeBinding.Bindings.Remove (element); } } protected override void RemoveBinding (Configuration config) { EnsureBindingRemoved (config) ; } public override void CommitChanges() { this.manifestFile.Commit(); this.configFile.Commit(); if (scope != null) { try { scope.Complete (); scope.Dispose (); } catch (Exception ex) { if (ex is NullReferenceException || ex is SEHException) { throw; } Tool.CreateException (SR.GetString (SR.FailedToCommitChangesToCatalog), ex); } } } public override void PrepareChanges() { this.closed = true; bool workDone = this.configFile.HasBeenModified() && WasModified; TransactionOptions opts = new TransactionOptions(); opts.Timeout = TimeSpan.FromMinutes (5); opts.IsolationLevel = IsolationLevel.Serializable; scope = new TransactionScope( TransactionScopeOption.Required, opts, EnterpriseServicesInteropOption.Full); if (workDone) { // if appDir doesnt exist, we must create it before we prepare the config files below if (this.mustGenerateAppDir) { // create it Directory.CreateDirectory(this.appDir); ToolConsole.WriteLine(SR.GetString(SR.DirectoryCreated, this.appDir)); } // set the COM+ app property ComAdminWrapper.SetAppDir(this.appInfo.ID.ToString("B"), this.appDir); } this.configFile.Prepare(); if (workDone) { ToolConsole.WriteLine(SR.GetString((this.configFile.OriginalFileExists ? SR.FileUpdated : SR.FileCreated), configFile.OriginalFileName)); } if (workDone && !this.manifestFile.CurrentExists() && this.hasServices) { string fileName = this.manifestFile.GetCurrentFileName(false); // for update CreateManifestFile(this.manifestFile.GetCurrentFileName(false)); ToolConsole.WriteLine(SR.GetString(SR.FileCreated, this.manifestFile.OriginalFileName)); } this.manifestFile.Prepare(); if (workDone) { // Now, install the Listener if it isnt already there if (this.hasServices && !this.listenerComponentExists) { ComAdminWrapper.InstallListener(this.appInfo.ID, this.appDir); } else if (!this.hasServices && this.listenerComponentExists) { ComAdminWrapper.RemoveListener(this.appInfo.ID); } if (this.appInfo.IsServerActivated) { ToolConsole.WriteWarning(SR.GetString(SR.ShouldRestartApp, this.appInfo.Name)); } } } void CreateManifestFile(string fileName) { using (StreamWriter sw = File.CreateText(fileName)) { sw.WriteLine(" "); } } //returns the properly formatted partiton id iff the app is not in the default partition string GetPartitionId(Guid appId) { string partitionId = null; partitionId = ComAdminWrapper.GetPartitionIdForApplication(appId); if ((!String.IsNullOrEmpty(partitionId)) && partitionId != ComAdminWrapper.GetGlobalPartitionID()) { //convert guid to representation without {} Guid partitionGuid = new Guid(partitionId); partitionId = partitionGuid.ToString(); partitionId = partitionId + "/"; } else partitionId = ""; return partitionId; } public override string DefaultEndpointAddress(Guid appId, Guid clsid, Guid iid) { ComAdminAppInfo adminAppInfo = ComAdminWrapper.GetAppInfo(appId.ToString("B")); if (null == adminAppInfo) { throw Tool.CreateException(SR.GetString(SR.CannotFindAppInfo, appId.ToString("B")), null); } ComAdminClassInfo adminClassInfo = adminAppInfo.FindClass(clsid.ToString("B")); if (null == adminClassInfo) { throw Tool.CreateException(SR.GetString(SR.CannotFindClassInfo, clsid.ToString("B")), null); } ComAdminInterfaceInfo adminInterfaceInfo = adminClassInfo.FindInterface(iid.ToString("B")); if (null == adminInterfaceInfo) { throw Tool.CreateException(SR.GetString(SR.CannotFindInterfaceInfo, iid.ToString("B")), null); } string uri = Uri.EscapeUriString(adminInterfaceInfo.Name); if (Uri.IsWellFormedUriString(uri, UriKind.RelativeOrAbsolute)) return uri; return iid.ToString().ToUpperInvariant(); } public override string DefaultMexAddress(Guid appId, Guid clsid) { return EndpointConfig.MexEndpointSuffix; } public override string BaseServiceAddress(Guid appId, Guid clsid, Guid iid) { ComAdminAppInfo adminAppInfo = ComAdminWrapper.GetAppInfo(appId.ToString("B")); if (null == adminAppInfo) { throw Tool.CreateException(SR.GetString(SR.CannotFindAppInfo, appId.ToString("B")), null); } ComAdminClassInfo adminClassInfo = adminAppInfo.FindClass(clsid.ToString("B")); if (null == adminClassInfo) { throw Tool.CreateException(SR.GetString(SR.CannotFindClassInfo, clsid.ToString("B")), null); } string uri = Uri.EscapeUriString("net.pipe://localhost/" + adminAppInfo.Name + "/" + GetPartitionId(appId) + adminClassInfo.Name); if (Uri.IsWellFormedUriString(uri, UriKind.Absolute)) return uri; return "net.pipe://localhost/" + (appId.ToString() + "/" + clsid.ToString()); } // Just like COM+ Import, we create the following directory "%ProgramFiles%\ComPlus Applications\{appid}" string GeneratedAppDirectoryName() { string programFiles; if (ComAdminWrapper.IsApplicationWow (appInfo.ID)) programFiles = Environment.GetEnvironmentVariable("ProgramFiles(x86)"); else programFiles = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles); return programFiles + "\\ComPlus Applications\\" + this.appInfo.ID.ToString("B") + "\\"; } public static List Get() { List containers = new List (); Guid[] ids = ComAdminWrapper.GetApplicationIds(); foreach (Guid id in ids) { ComplusEndpointConfigContainer container = ComplusEndpointConfigContainer.Get(id.ToString("B")); if (container != null) containers.Add(container); } return containers; } public static ComplusEndpointConfigContainer Get(string appIdOrName) { return Get(appIdOrName, false); } public static ComplusEndpointConfigContainer Get(string appIdOrName, bool rethrow) { ComAdminAppInfo appInfo = ComAdminWrapper.GetAppInfo(appIdOrName); if (appInfo == null) { return null; } try { ComplusEndpointConfigContainer container = new ComplusEndpointConfigContainer(appInfo); return container; } catch (Exception ex) { if (ex is NullReferenceException || ex is SEHException) { throw; } if(rethrow) throw; else ToolConsole.WriteWarning(SR.GetString(SR.FailedToLoadConfigForApplicationIgnoring, appInfo.Name, ex.Message)); } return null; } public override Configuration GetConfiguration(bool readOnly) { string fileName = this.configFile.GetCurrentFileName(readOnly); if (string.IsNullOrEmpty(fileName)) { return null; } return GetConfigurationFromFile(fileName); } public override List GetBaseAddresses(EndpointConfig config) { List ret = new List (); Configuration svcconfig = GetConfiguration(true); ServiceModelSectionGroup sg = ServiceModelSectionGroup.GetSectionGroup(svcconfig); ServiceElementCollection serviceColl = sg.Services.Services; ServiceElement serviceElement = null; // Find serviceElement foreach (ServiceElement el in serviceColl) { if (config.MatchServiceType(el.Name)) { serviceElement = el; break; } } if (null == serviceElement) return ret; foreach (BaseAddressElement element in serviceElement.Host.BaseAddresses) ret.Add(element.BaseAddress); return ret; } public override List GetEndpointConfigs() { ThrowIfClosed(); Configuration config = GetConfiguration(true); // readonly if (config == null) { // null config means there is no config to read, return an empty list return new List (); } Dictionary > endpointConfigs = BaseGetEndpointsFromConfiguration(config); List list = new List (); // now, fix up the appid for all the endpoints foreach (List endpoints in endpointConfigs.Values) { foreach (EndpointConfig endpoint in endpoints) { endpoint.Appid = this.appInfo.ID; endpoint.Container = this; list.Add(endpoint); } } return list; } // we override the default implementation since this container represents a single app anyway public override List GetEndpointConfigs(Guid appid) { ThrowIfClosed(); if (appid == this.appInfo.ID) { return this.GetEndpointConfigs(); // all our endpoints are for that appid } else { return new List (); } } public override void Remove(IList endpointConfigs) { ThrowIfClosed(); Configuration config = GetConfiguration(false); // not read only Debug.Assert(config != null, "config != null"); bool anyRemoved = false; foreach (EndpointConfig endpointConfig in endpointConfigs) { Debug.Assert(endpointConfig.Appid == this.appInfo.ID, "can't remove endpoint for a different application"); bool removed = this.BaseRemoveEndpointConfig(config, endpointConfig); if (removed) { anyRemoved = true; if (!Tool.Options.ShowGuids) ToolConsole.WriteLine(SR.GetString(SR.InterfaceRemoved, endpointConfig.ComponentProgID, endpointConfig.InterfaceName)); else ToolConsole.WriteLine(SR.GetString(SR.InterfaceRemoved, endpointConfig.Clsid, endpointConfig.Iid)); } else if (!endpointConfig.IsMexEndpoint) { if (!Tool.Options.ShowGuids) ToolConsole.WriteWarning(SR.GetString(SR.InterfaceNotExposed, endpointConfig.ComponentProgID, endpointConfig.InterfaceName)); else ToolConsole.WriteWarning(SR.GetString(SR.InterfaceNotExposed, endpointConfig.Clsid, endpointConfig.Iid)); } } this.hasServices = ServiceModelSectionGroup.GetSectionGroup(config).Services.Services.Count > 0; if (anyRemoved) { WasModified = true; config.Save(); } } void ThrowIfClosed() { if (this.closed) { Debug.Assert(false, "attempting operation after container is closed"); throw new InvalidOperationException(); } } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- UnsafeNativeMethods.cs
- Graph.cs
- CompositeKey.cs
- ImageField.cs
- NamedPermissionSet.cs
- LocalizableAttribute.cs
- XmlElementList.cs
- ModuleBuilderData.cs
- Quaternion.cs
- DispatchWrapper.cs
- UnmanagedMarshal.cs
- OdbcCommandBuilder.cs
- BufferedResponseStream.cs
- DiagnosticSection.cs
- oledbconnectionstring.cs
- Sql8ConformanceChecker.cs
- ImageListImageEditor.cs
- XmlWriter.cs
- TrackingServices.cs
- SchemaContext.cs
- PrintPreviewDialog.cs
- GestureRecognitionResult.cs
- OleDbCommand.cs
- QilBinary.cs
- SafeFileMapViewHandle.cs
- GridViewRowPresenter.cs
- LineSegment.cs
- PathTooLongException.cs
- EdmConstants.cs
- AutomationAttributeInfo.cs
- DesignerActionPanel.cs
- RawAppCommandInputReport.cs
- WebConfigurationManager.cs
- InternalRelationshipCollection.cs
- DataChangedEventManager.cs
- DataGridViewRowCollection.cs
- PassportAuthenticationEventArgs.cs
- AppDomainResourcePerfCounters.cs
- IndividualDeviceConfig.cs
- AppSettingsReader.cs
- Stylus.cs
- BCryptSafeHandles.cs
- DataGridViewLinkColumn.cs
- XmlSchemaValidationException.cs
- DataRowView.cs
- TagPrefixInfo.cs
- UnsafeNativeMethods.cs
- AsyncCompletedEventArgs.cs
- DataObject.cs
- ApplicationManager.cs
- PenCursorManager.cs
- VisualProxy.cs
- QilNode.cs
- UniqueEventHelper.cs
- VirtualPath.cs
- KeyValueSerializer.cs
- PropertyPathWorker.cs
- FormatConvertedBitmap.cs
- TTSEvent.cs
- SoapObjectInfo.cs
- Annotation.cs
- QueryExpr.cs
- SafeMILHandleMemoryPressure.cs
- EntityViewGenerator.cs
- TreeNodeCollectionEditorDialog.cs
- ObjectToModelValueConverter.cs
- Atom10FormatterFactory.cs
- OdbcParameter.cs
- Verify.cs
- LoginDesigner.cs
- XamlReader.cs
- ExpandSegment.cs
- DocumentXPathNavigator.cs
- UrlMappingsSection.cs
- XmlSchemaSubstitutionGroup.cs
- brushes.cs
- XamlFxTrace.cs
- RenderOptions.cs
- Size.cs
- KeyInstance.cs
- OracleConnectionStringBuilder.cs
- WCFModelStrings.Designer.cs
- XPathNodeList.cs
- SoapTypeAttribute.cs
- EntityDataSourceDataSelection.cs
- CounterCreationData.cs
- DataExchangeServiceBinder.cs
- BitmapSourceSafeMILHandle.cs
- ColumnCollection.cs
- BufferedReceiveElement.cs
- ToolStripComboBox.cs
- DrawingGroupDrawingContext.cs
- PermissionToken.cs
- AlphabeticalEnumConverter.cs
- GrabHandleGlyph.cs
- ClientCredentialsSecurityTokenManager.cs
- InputProviderSite.cs
- BuilderPropertyEntry.cs
- AccessDataSource.cs
- ConnectorDragDropGlyph.cs