Search code examples
asp.netappdomainsetuptemporary-asp.net-files

How to determine the \Temporary ASP.NET Files\root\{site hash} with PowerShell?


ASP.NET makes use of a temporary files directory to store files for Shadow Copying and Dynamic Compilation. A typical path will look like this. Note the hash on the end of the path.

C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\root\{hash}

I'm using automated deployments and have noticed that these folders and their contents are not automatically removed. I'd like to automate the process of removing unused temp files as part of my deployment process. Such that as soon as the new version of my site is deployed the old temp files are removed.

The hash seems to be generated in a deterministic manner so I'm hoping I'll be able to determine the hash as part of my pre-deployment script and delete it post-deployment.

How is the hash calculated for an ASP.NET website?

References:

  1. How .Net names its temp folder inside C:\Windows\Microsoft.NET\Framework\v{version}\Temporary ASP.NET Files\root
  2. http://blogs.msdn.com/b/junfeng/archive/2004/02/09/69919.aspx
  3. http://dotnetinside.com/en/type/System.Web/ApplicationManager/4.0.0.0

Solution

  • Well, a few moments with Reflector, searching all members within System.Web for the word "Temporary" shows this call gets me here:

    string str2 = AppManagerAppDomainFactory.ConstructSimpleAppName(AppDomainAppVirtualPath);
    

    But then I remember that the source code is available for all of .NET, so I move to the actual code, rather than the reflectored code: https://referencesource.microsoft.com/#System.Web/HttpRuntime.cs,870

    Later in that method "SetupCodeGenDirectory" the path appears to be built on top of with

     this._codegenDir = Thread.GetDomain().DynamicDirectory;
    

    So, looks like that hash is from DynamicDirectory. That's over here at http://referencesource.microsoft.com/#mscorlib/system/appdomain.cs#2792 which looks like an extern that is inside some COM Fusion Loader stuff:

    [ComImport,InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("7c23ff90-33af-11d3-95da-00a024a85b51")]
    

    But that GUID leads me here http://referencesource.microsoft.com/#mscorlib/microsoft/win32/fusionwrap.cs#94

    which implies it's a public key token part:

         public const uint HASH_VALUE            = PUBLIC_KEY_TOKEN + 1;
         public const uint NAME                  = HASH_VALUE + 1;
    

    That perhaps it's NAME? I'm guessing it's yourAssembly.GetPublicKeyToken();

    OR, just change the folder that your temporary ASP.NET files go to in config section http://msdn.microsoft.com/en-us/library/system.web.configuration.compilationsection.tempdirectory%28VS.80%29.aspx in system.web in web.config

    <compilation tempDirectory="D:\MoveThemHere">