Code:
/ FXUpdate3074 / FXUpdate3074 / 1.1 / DEVDIV / depot / DevDiv / releases / whidbey / QFE / ndp / fx / src / xsp / System / Web / Configuration / ProcessHostServerConfig.cs / 2 / ProcessHostServerConfig.cs
//------------------------------------------------------------------------------ //// Copyright (c) Microsoft Corporation. All rights reserved. // //----------------------------------------------------------------------------- namespace System.Web.Configuration { using System.Configuration; using System.Collections; using System.Globalization; using System.Runtime.InteropServices; using System.Xml; using System.Text; using System.Web.Caching; using System.Web.Util; using System.Web.UI; using System.IO; using System.Web.Hosting; // // Uses IIS 7 native config // internal sealed class ProcessHostServerConfig : IServerConfig { static object s_initLock = new Object(); static ProcessHostServerConfig s_instance; string _siteNameForCurrentApplication; static internal IServerConfig GetInstance() { if (s_instance == null) { lock (s_initLock) { if (s_instance == null) { s_instance = new ProcessHostServerConfig(); } } } return s_instance; } static ProcessHostServerConfig() { HttpRuntime.ForceStaticInit(); } ProcessHostServerConfig() { if (null == HostingEnvironment.SupportFunctions) { ProcessHostConfigUtils.InitStandaloneConfig(); } else { IProcessHostSupportFunctions fns = HostingEnvironment.SupportFunctions; if (null != fns ) { IntPtr configSystem = fns.GetNativeConfigurationSystem(); Debug.Assert(IntPtr.Zero != configSystem, "null != configSystem"); if (IntPtr.Zero != configSystem) { // won't fail if valid pointer // no cleanup needed, we don't own instance UnsafeIISMethods.MgdSetNativeConfiguration(configSystem); } } } _siteNameForCurrentApplication = HostingEnvironment.SiteNameNoDemand; if (_siteNameForCurrentApplication == null) { _siteNameForCurrentApplication = ProcessHostConfigUtils.GetSiteNameFromId(ProcessHostConfigUtils.DEFAULT_SITE_ID_UINT); } } string IServerConfig.GetSiteNameFromSiteID(string siteID) { uint siteIDValue; if (!UInt32.TryParse(siteID, out siteIDValue)) { Debug.Assert(false, "siteID is not numeric"); return String.Empty; } return ProcessHostConfigUtils.GetSiteNameFromId(siteIDValue); } // if appHost is null, we use the site name for the current application string IServerConfig.MapPath(IApplicationHost appHost, VirtualPath path) { string siteName = (appHost == null) ? _siteNameForCurrentApplication : appHost.GetSiteName(); string physicalPath = ProcessHostConfigUtils.MapPathActual(siteName, path); if (FileUtil.IsSuspiciousPhysicalPath(physicalPath)) { throw new InvalidOperationException(SR.GetString(SR.Cannot_map_path, path.VirtualPathString)); } return physicalPath; } string[] IServerConfig.GetVirtualSubdirs(VirtualPath path, bool inApp) { // WOS 1956227: PERF: inactive applications on the web server degrade Working Set by 10% // It is very expensive to get a list of subdirs not in the application if there are a lot of applications, // so instead, use ProcessHostServerConfig.IsWithinApp to if (inApp == false) { throw new NotSupportedException(); } string vpath = path.VirtualPathString; string [] dirList = null; int dirListCount = 0; IntPtr pAppCollection = IntPtr.Zero; IntPtr pBstr = IntPtr.Zero; int cBstr = 0; try { int count = 0; int result = UnsafeIISMethods.MgdGetAppCollection(_siteNameForCurrentApplication, vpath, out pBstr, out cBstr, out pAppCollection, out count); if (result < 0 || pBstr == IntPtr.Zero) { throw new InvalidOperationException(SR.GetString(SR.Cant_Enumerate_NativeDirs, result)); } string appRoot = StringUtil.StringFromWCharPtr(pBstr, cBstr); Marshal.FreeBSTR(pBstr); pBstr = IntPtr.Zero; cBstr = 0; dirList = new string[count]; int lenNoTrailingSlash = vpath.Length; if (vpath[lenNoTrailingSlash - 1] == '/') { lenNoTrailingSlash--; } int lenAppRoot = appRoot.Length; string appRootRelativePath = (lenNoTrailingSlash > lenAppRoot) ? vpath.Substring(lenAppRoot, lenNoTrailingSlash - lenAppRoot) : String.Empty; for (uint index = 0; index < count; index++) { result = UnsafeIISMethods.MgdGetNextVPath(pAppCollection, index, out pBstr, out cBstr); if (result < 0 || pBstr == IntPtr.Zero) { throw new InvalidOperationException(SR.GetString(SR.Cant_Enumerate_NativeDirs, result)); } // if cBstr = 1, then pBstr = "/" and can be ignored string subVdir = (cBstr > 1) ? StringUtil.StringFromWCharPtr(pBstr, cBstr) : null; Marshal.FreeBSTR(pBstr); pBstr = IntPtr.Zero; cBstr = 0; // only put the subVdir in our list if it is a subdirectory of the specified vpath if (subVdir != null && subVdir.Length > appRootRelativePath.Length) { if (appRootRelativePath.Length == 0) { if (subVdir.IndexOf('/', 1) == -1) { dirList[dirListCount++] = subVdir.Substring(1); } } else if (StringUtil.EqualsIgnoreCase(appRootRelativePath, 0, subVdir, 0, appRootRelativePath.Length)) { int nextSlashIndex = subVdir.IndexOf('/', 1 + appRootRelativePath.Length); if (nextSlashIndex > -1) { dirList[dirListCount++] = subVdir.Substring(appRootRelativePath.Length + 1, nextSlashIndex - appRootRelativePath.Length); } else { dirList[dirListCount++] = subVdir.Substring(appRootRelativePath.Length + 1); } } } } } finally { if (pAppCollection != IntPtr.Zero) { Marshal.Release(pAppCollection); pAppCollection = IntPtr.Zero; } if (pBstr != IntPtr.Zero) { Marshal.FreeBSTR(pBstr); pBstr = IntPtr.Zero; } } string[] subdirs = null; if (dirListCount > 0) { subdirs = new string[dirListCount]; for (int i = 0; i < subdirs.Length; i++) { subdirs[i] = dirList[i]; } } return subdirs; } internal bool IsWithinApp(string virtualPath) { return UnsafeIISMethods.MgdIsWithinApp(_siteNameForCurrentApplication, HttpRuntime.AppDomainAppVirtualPathString, virtualPath); } bool IServerConfig.GetUncUser(IApplicationHost appHost, VirtualPath path, out string username, out string password) { bool foundCreds = false; username = null; password = null; IntPtr pBstrUserName = IntPtr.Zero; int cBstrUserName = 0; IntPtr pBstrPassword = IntPtr.Zero; int cBstrPassword = 0; try { int result = UnsafeIISMethods.MgdGetVrPathCreds( appHost.GetSiteName(), path.VirtualPathString, out pBstrUserName, out cBstrUserName, out pBstrPassword, out cBstrPassword); if (result == 0) { username = (cBstrUserName > 0) ? StringUtil.StringFromWCharPtr(pBstrUserName, cBstrUserName) : null; password = (cBstrPassword > 0) ? StringUtil.StringFromWCharPtr(pBstrPassword, cBstrPassword) : null; foundCreds = (!String.IsNullOrEmpty(username) && !String.IsNullOrEmpty(password)); } } finally { if (pBstrUserName != IntPtr.Zero) { Marshal.FreeBSTR(pBstrUserName); } if (pBstrPassword != IntPtr.Zero) { Marshal.FreeBSTR(pBstrPassword); } } return foundCreds; } long IServerConfig.GetW3WPMemoryLimitInKB() { long limit = 0; int result = UnsafeIISMethods.MgdGetMemoryLimitKB( out limit ); if (result < 0) return 0; return limit; } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved. //------------------------------------------------------------------------------ //// Copyright (c) Microsoft Corporation. All rights reserved. // //----------------------------------------------------------------------------- namespace System.Web.Configuration { using System.Configuration; using System.Collections; using System.Globalization; using System.Runtime.InteropServices; using System.Xml; using System.Text; using System.Web.Caching; using System.Web.Util; using System.Web.UI; using System.IO; using System.Web.Hosting; // // Uses IIS 7 native config // internal sealed class ProcessHostServerConfig : IServerConfig { static object s_initLock = new Object(); static ProcessHostServerConfig s_instance; string _siteNameForCurrentApplication; static internal IServerConfig GetInstance() { if (s_instance == null) { lock (s_initLock) { if (s_instance == null) { s_instance = new ProcessHostServerConfig(); } } } return s_instance; } static ProcessHostServerConfig() { HttpRuntime.ForceStaticInit(); } ProcessHostServerConfig() { if (null == HostingEnvironment.SupportFunctions) { ProcessHostConfigUtils.InitStandaloneConfig(); } else { IProcessHostSupportFunctions fns = HostingEnvironment.SupportFunctions; if (null != fns ) { IntPtr configSystem = fns.GetNativeConfigurationSystem(); Debug.Assert(IntPtr.Zero != configSystem, "null != configSystem"); if (IntPtr.Zero != configSystem) { // won't fail if valid pointer // no cleanup needed, we don't own instance UnsafeIISMethods.MgdSetNativeConfiguration(configSystem); } } } _siteNameForCurrentApplication = HostingEnvironment.SiteNameNoDemand; if (_siteNameForCurrentApplication == null) { _siteNameForCurrentApplication = ProcessHostConfigUtils.GetSiteNameFromId(ProcessHostConfigUtils.DEFAULT_SITE_ID_UINT); } } string IServerConfig.GetSiteNameFromSiteID(string siteID) { uint siteIDValue; if (!UInt32.TryParse(siteID, out siteIDValue)) { Debug.Assert(false, "siteID is not numeric"); return String.Empty; } return ProcessHostConfigUtils.GetSiteNameFromId(siteIDValue); } // if appHost is null, we use the site name for the current application string IServerConfig.MapPath(IApplicationHost appHost, VirtualPath path) { string siteName = (appHost == null) ? _siteNameForCurrentApplication : appHost.GetSiteName(); string physicalPath = ProcessHostConfigUtils.MapPathActual(siteName, path); if (FileUtil.IsSuspiciousPhysicalPath(physicalPath)) { throw new InvalidOperationException(SR.GetString(SR.Cannot_map_path, path.VirtualPathString)); } return physicalPath; } string[] IServerConfig.GetVirtualSubdirs(VirtualPath path, bool inApp) { // WOS 1956227: PERF: inactive applications on the web server degrade Working Set by 10% // It is very expensive to get a list of subdirs not in the application if there are a lot of applications, // so instead, use ProcessHostServerConfig.IsWithinApp to if (inApp == false) { throw new NotSupportedException(); } string vpath = path.VirtualPathString; string [] dirList = null; int dirListCount = 0; IntPtr pAppCollection = IntPtr.Zero; IntPtr pBstr = IntPtr.Zero; int cBstr = 0; try { int count = 0; int result = UnsafeIISMethods.MgdGetAppCollection(_siteNameForCurrentApplication, vpath, out pBstr, out cBstr, out pAppCollection, out count); if (result < 0 || pBstr == IntPtr.Zero) { throw new InvalidOperationException(SR.GetString(SR.Cant_Enumerate_NativeDirs, result)); } string appRoot = StringUtil.StringFromWCharPtr(pBstr, cBstr); Marshal.FreeBSTR(pBstr); pBstr = IntPtr.Zero; cBstr = 0; dirList = new string[count]; int lenNoTrailingSlash = vpath.Length; if (vpath[lenNoTrailingSlash - 1] == '/') { lenNoTrailingSlash--; } int lenAppRoot = appRoot.Length; string appRootRelativePath = (lenNoTrailingSlash > lenAppRoot) ? vpath.Substring(lenAppRoot, lenNoTrailingSlash - lenAppRoot) : String.Empty; for (uint index = 0; index < count; index++) { result = UnsafeIISMethods.MgdGetNextVPath(pAppCollection, index, out pBstr, out cBstr); if (result < 0 || pBstr == IntPtr.Zero) { throw new InvalidOperationException(SR.GetString(SR.Cant_Enumerate_NativeDirs, result)); } // if cBstr = 1, then pBstr = "/" and can be ignored string subVdir = (cBstr > 1) ? StringUtil.StringFromWCharPtr(pBstr, cBstr) : null; Marshal.FreeBSTR(pBstr); pBstr = IntPtr.Zero; cBstr = 0; // only put the subVdir in our list if it is a subdirectory of the specified vpath if (subVdir != null && subVdir.Length > appRootRelativePath.Length) { if (appRootRelativePath.Length == 0) { if (subVdir.IndexOf('/', 1) == -1) { dirList[dirListCount++] = subVdir.Substring(1); } } else if (StringUtil.EqualsIgnoreCase(appRootRelativePath, 0, subVdir, 0, appRootRelativePath.Length)) { int nextSlashIndex = subVdir.IndexOf('/', 1 + appRootRelativePath.Length); if (nextSlashIndex > -1) { dirList[dirListCount++] = subVdir.Substring(appRootRelativePath.Length + 1, nextSlashIndex - appRootRelativePath.Length); } else { dirList[dirListCount++] = subVdir.Substring(appRootRelativePath.Length + 1); } } } } } finally { if (pAppCollection != IntPtr.Zero) { Marshal.Release(pAppCollection); pAppCollection = IntPtr.Zero; } if (pBstr != IntPtr.Zero) { Marshal.FreeBSTR(pBstr); pBstr = IntPtr.Zero; } } string[] subdirs = null; if (dirListCount > 0) { subdirs = new string[dirListCount]; for (int i = 0; i < subdirs.Length; i++) { subdirs[i] = dirList[i]; } } return subdirs; } internal bool IsWithinApp(string virtualPath) { return UnsafeIISMethods.MgdIsWithinApp(_siteNameForCurrentApplication, HttpRuntime.AppDomainAppVirtualPathString, virtualPath); } bool IServerConfig.GetUncUser(IApplicationHost appHost, VirtualPath path, out string username, out string password) { bool foundCreds = false; username = null; password = null; IntPtr pBstrUserName = IntPtr.Zero; int cBstrUserName = 0; IntPtr pBstrPassword = IntPtr.Zero; int cBstrPassword = 0; try { int result = UnsafeIISMethods.MgdGetVrPathCreds( appHost.GetSiteName(), path.VirtualPathString, out pBstrUserName, out cBstrUserName, out pBstrPassword, out cBstrPassword); if (result == 0) { username = (cBstrUserName > 0) ? StringUtil.StringFromWCharPtr(pBstrUserName, cBstrUserName) : null; password = (cBstrPassword > 0) ? StringUtil.StringFromWCharPtr(pBstrPassword, cBstrPassword) : null; foundCreds = (!String.IsNullOrEmpty(username) && !String.IsNullOrEmpty(password)); } } finally { if (pBstrUserName != IntPtr.Zero) { Marshal.FreeBSTR(pBstrUserName); } if (pBstrPassword != IntPtr.Zero) { Marshal.FreeBSTR(pBstrPassword); } } return foundCreds; } long IServerConfig.GetW3WPMemoryLimitInKB() { long limit = 0; int result = UnsafeIISMethods.MgdGetMemoryLimitKB( out limit ); if (result < 0) return 0; return limit; } } } // 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
- SelectedDatesCollection.cs
- AssertSection.cs
- XomlCompilerResults.cs
- ColorConvertedBitmapExtension.cs
- mda.cs
- NumericUpDown.cs
- WaitForChangedResult.cs
- TableRowsCollectionEditor.cs
- TransformGroup.cs
- UserMapPath.cs
- SystemUnicastIPAddressInformation.cs
- RegisteredDisposeScript.cs
- PathFigureCollection.cs
- HandlerBase.cs
- PointUtil.cs
- SourceSwitch.cs
- NamespaceEmitter.cs
- thaishape.cs
- CodeDirectionExpression.cs
- X509CertificateClaimSet.cs
- RecognizedAudio.cs
- X509ClientCertificateAuthentication.cs
- SmiGettersStream.cs
- MemberMaps.cs
- TextBoxAutoCompleteSourceConverter.cs
- BatchServiceHost.cs
- PropertyGridView.cs
- RC2CryptoServiceProvider.cs
- SQLConvert.cs
- CommandDevice.cs
- DataGridTextBoxColumn.cs
- File.cs
- FunctionImportElement.cs
- ImageMapEventArgs.cs
- PeerIPHelper.cs
- recordstate.cs
- InfoCardSymmetricAlgorithm.cs
- precedingsibling.cs
- Vertex.cs
- CommonXSendMessage.cs
- OleDbCommand.cs
- SurrogateSelector.cs
- XmlObjectSerializerWriteContextComplex.cs
- ObjectDataSourceChooseTypePanel.cs
- AssociationEndMember.cs
- RectAnimation.cs
- BaseTemplateCodeDomTreeGenerator.cs
- FixedSOMLineCollection.cs
- SchemaInfo.cs
- HtmlInputHidden.cs
- OptimalTextSource.cs
- NotifyIcon.cs
- HybridDictionary.cs
- TransformProviderWrapper.cs
- NoResizeSelectionBorderGlyph.cs
- ProcessStartInfo.cs
- Evidence.cs
- ListControl.cs
- PropertyValueUIItem.cs
- TextBoxAutoCompleteSourceConverter.cs
- Int64Animation.cs
- AppDomainUnloadedException.cs
- AddressAlreadyInUseException.cs
- SectionVisual.cs
- Root.cs
- DrawingBrush.cs
- EventLogPermissionEntry.cs
- JumpTask.cs
- SHA256.cs
- Code.cs
- ReadContentAsBinaryHelper.cs
- ServerType.cs
- SchemaObjectWriter.cs
- SchemaMerger.cs
- CapiSymmetricAlgorithm.cs
- UIElementHelper.cs
- CapabilitiesRule.cs
- SimpleWorkerRequest.cs
- SAPICategories.cs
- Timer.cs
- MapPathBasedVirtualPathProvider.cs
- SyntaxCheck.cs
- ConnectionPoint.cs
- PointCollection.cs
- CodeMemberField.cs
- MouseGestureConverter.cs
- ListGeneralPage.cs
- TagNameToTypeMapper.cs
- AlternationConverter.cs
- _NativeSSPI.cs
- SplitterPanelDesigner.cs
- WebPartConnectionsCloseVerb.cs
- ExpandCollapseIsCheckedConverter.cs
- EmptyTextWriter.cs
- EventManager.cs
- Point3DKeyFrameCollection.cs
- RangeValidator.cs
- TextTreeText.cs
- PropertyCondition.cs
- ParserExtension.cs