AspProxy.cs source code in C# .NET

Source code for the .NET framework in C#

                        

Code:

/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / DataEntity / System / Data / Metadata / AspProxy.cs / 1305376 / AspProxy.cs

                            //---------------------------------------------------------------------- 
// 
//      Copyright (c) Microsoft Corporation.  All rights reserved.
// 
// 
// @owner       [....]
// @backupOwner [....] 
//--------------------------------------------------------------------- 

 
using System.Reflection;
using System.Diagnostics;
using System.Data.Entity;
using System.Collections.Generic; 
using System.Collections;
using System.Linq; 
 
namespace System.Data.Metadata.Edm
{ 
    internal class AspProxy
    {
        private const string BUILD_MANAGER_TYPE_NAME = @"System.Web.Compilation.BuildManager";
        private Assembly _webAssembly; 
        private bool _triedLoadingWebAssembly = false;
 
        ///  
        /// Determine whether we are inside an ASP.NET application.
        ///  
        /// The System.Web assembly
        /// true if we are running inside an ASP.NET application
        internal bool IsAspNetEnvironment()
        { 
            if (!TryInitializeWebAssembly())
            { 
                return false; 
            }
 
            try
            {
                string result = PrivateMapWebPath(EdmConstants.WebHomeSymbol);
                return result != null; 
            }
            catch (Exception e) 
            { 
                if (EntityUtil.IsCatchableExceptionType(e))
                { 
                    return false;
                }

                throw; 
            }
        } 
 

 

        private bool TryInitializeWebAssembly()
        {
            // We cannot introduce a hard dependency on the System.Web assembly, so we load 
            // it via reflection.
            // 
            if (_webAssembly != null) 
            {
                return true; 
            }
            else if (_triedLoadingWebAssembly)
            {
                return false; 
            }
 
            Debug.Assert(_triedLoadingWebAssembly == false); 
            Debug.Assert(_webAssembly == null);
            _triedLoadingWebAssembly = true; 
            try
            {
                _webAssembly = Assembly.Load(AssemblyRef.SystemWeb);
                return _webAssembly != null; 
            }
            catch (Exception e) 
            { 
                if (!EntityUtil.IsCatchableExceptionType(e))
                { 

                    throw;  // StackOverflow, OutOfMemory, ...
                }
 
                // It is possible that we are operating in an environment where
                // System.Web is simply not available (for instance, inside SQL 
                // Server). Instead of throwing or rethrowing, we simply fail 
                // gracefully
 
            }

            return false;
        } 

        void InitializeWebAssembly() 
        { 
            if (!TryInitializeWebAssembly())
            { 
                throw EntityUtil.InvalidOperation(System.Data.Entity.Strings.UnableToDetermineApplicationContext);
            }
        }
 
        /// 
        /// This method accepts a string parameter that represents a path in a Web (specifically, 
        /// an ASP.NET) application -- one that starts with a '~' -- and resolves it to a 
        /// canonical file path.
        ///  
        /// 
        /// The implementation assumes that you cannot have file names that begin with the '~'
        /// character. (This is a pretty reasonable assumption.) Additionally, the method does not
        /// test for the existence of a directory or file resource after resolving the path. 
        ///
 
 

 


        internal string MapWebPath(string path)
        { 
            Debug.Assert(path != null, "path == null");
 
            path = PrivateMapWebPath(path); 
            if (path == null)
            { 
                string errMsg = Strings.InvalidUseOfWebPath(EdmConstants.WebHomeSymbol);
                throw EntityUtil.InvalidOperation(errMsg);
            }
            return path; 
        }
 
        private string PrivateMapWebPath(string path) 
        {
            Debug.Assert(!string.IsNullOrEmpty(path)); 
            Debug.Assert(path.StartsWith(EdmConstants.WebHomeSymbol, StringComparison.Ordinal));

            InitializeWebAssembly();
            // Each managed application domain contains a static instance of the HostingEnvironment class, which 
            // provides access to application-management functions and application services. We'll try to invoke
            // the static method MapPath() on that object. 
            // 
            try
            { 
                Type hostingEnvType = _webAssembly.GetType("System.Web.Hosting.HostingEnvironment", true);

                MethodInfo miMapPath = hostingEnvType.GetMethod("MapPath");
                Debug.Assert(miMapPath != null, "Unpexpected missing member in type System.Web.Hosting.HostingEnvironment"); 

                // Note: 
                //   1. If path is null, then the MapPath() method returns the full physical path to the directory 
                //      containing the current application.
                //   2. Any attempt to navigate out of the application directory (using "../..") will generate 
                //      a (wrapped) System.Web.HttpException under ASP.NET (which we catch and re-throw).
                //
                return (string)miMapPath.Invoke(null, new object[] { path });
            } 
            catch (TargetException e)
            { 
                throw EntityUtil.InvalidOperation(System.Data.Entity.Strings.UnableToDetermineApplicationContext, e); 
            }
            catch (ArgumentException e) 
            {
                throw EntityUtil.InvalidOperation(System.Data.Entity.Strings.UnableToDetermineApplicationContext, e);
            }
            catch (TargetInvocationException e) 
            {
                throw EntityUtil.InvalidOperation(System.Data.Entity.Strings.UnableToDetermineApplicationContext, e); 
            } 
            catch (TargetParameterCountException e)
            { 
                throw EntityUtil.InvalidOperation(System.Data.Entity.Strings.UnableToDetermineApplicationContext, e);
            }
            catch (MethodAccessException e)
            { 
                throw EntityUtil.InvalidOperation(System.Data.Entity.Strings.UnableToDetermineApplicationContext, e);
            } 
            catch (MemberAccessException e) 
            {
                throw EntityUtil.InvalidOperation(System.Data.Entity.Strings.UnableToDetermineApplicationContext, e); 
            }
            catch (TypeLoadException e)
            {
                throw EntityUtil.InvalidOperation(System.Data.Entity.Strings.UnableToDetermineApplicationContext, e); 
            }
        } 
 
        internal bool HasBuildManagerType()
        { 
            Type buildManager;
            return TryGetBuildManagerType(out buildManager);
        }
 

        private bool TryGetBuildManagerType(out Type buildManager) 
        { 
            InitializeWebAssembly();
            buildManager = _webAssembly.GetType(BUILD_MANAGER_TYPE_NAME, false); 
            return buildManager != null;

        }
 
        internal IEnumerable GetBuildManagerReferencedAssemblies()
        { 
            // We are interested in invoking the following method on the class 
            // System.Web.Compilation.BuildManager, which is available only in Orcas:
            // 
            //    public static ICollection GetReferencedAssemblies();
            //
            Type buildManager;
            if (!TryGetBuildManagerType(out buildManager)) 
            {
                throw EntityUtil.InvalidOperation(System.Data.Entity.Strings.UnableToFindReflectedType(BUILD_MANAGER_TYPE_NAME, AssemblyRef.SystemWeb)); 
            } 

            MethodInfo getRefAssembliesMethod = buildManager.GetMethod( 
                                                            @"GetReferencedAssemblies",
                                                            BindingFlags.InvokeMethod | BindingFlags.Static | BindingFlags.Public
                                                        );
 
            if (getRefAssembliesMethod == null)
            { 
                // eat this problem 
                return new List();
            } 

            ICollection referencedAssemblies = null;
            try
            { 
                referencedAssemblies = (ICollection)getRefAssembliesMethod.Invoke(null, null);
                if (referencedAssemblies == null) 
                { 
                    return new List();
                } 
                return referencedAssemblies.Cast();
            }
            catch (TargetException e)
            { 
                throw EntityUtil.InvalidOperation(System.Data.Entity.Strings.UnableToDetermineApplicationContext, e);
            } 
            catch (TargetInvocationException e) 
            {
                throw EntityUtil.InvalidOperation(System.Data.Entity.Strings.UnableToDetermineApplicationContext, e); 
            }
            catch (MethodAccessException e)
            {
                throw EntityUtil.InvalidOperation(System.Data.Entity.Strings.UnableToDetermineApplicationContext, e); 
            }
        } 
    } 
}

// File provided for Reference Use Only by Microsoft Corporation (c) 2007.


                        

Link Menu

Network programming in C#, Network Programming in VB.NET, Network Programming in .NET
This book is available now!
Buy at Amazon US or
Buy at Amazon UK