如何使用PowerShell确定\ Temporary ASP.NET Files \ root \ {site hash}?

时间:2014-07-02 06:02:15

标签: asp.net appdomainsetup temporary-asp.net-files

ASP.NET使用临时文件目录来存储卷影复制和动态编译的文件。典型的路径将如下所示。注意路径末尾的哈希值。

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

我正在使用自动部署,并注意到这些文件夹及其内容不会自动删除。作为部署过程的一部分,我想自动删除未使用的临时文件的过程。这样,只要部署了我的站点的新版本,就会删除旧的临时文件。

哈希似乎是以确定的方式生成的,所以我希望我能够将哈希确定为部署前脚本的一部分,并在部署后删除它。

如何为ASP.NET网站计算哈希值?

参考文献:

  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

2 个答案:

答案 0 :(得分:3)

好吧,有一点时间使用Reflector,在System.Web中搜索“Temporary”这个词的所有成员显示这个调用让我来到这里:

string str2 = AppManagerAppDomainFactory.ConstructSimpleAppName(AppDomainAppVirtualPath);

但后来我记得源代码可用于所有.NET,因此我转向实际代码,而不是反射代码:https://referencesource.microsoft.com/#System.Web/HttpRuntime.cs,870

稍后在该方法“SetupCodeGenDirectory”中,路径似乎构建在

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

因此,看起来哈希来自DynamicDirectory。那就在http://referencesource.microsoft.com/#mscorlib/system/appdomain.cs#2792,这看起来像是一个COM融合加载器内部的外部东西:

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

但GUID引导我到这里http://referencesource.microsoft.com/#mscorlib/microsoft/win32/fusionwrap.cs#94

这意味着它是一个公钥令牌部分:

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

那也许是NAME?我猜它是yourAssembly.GetPublicKeyToken();

或者,只需在web.config中的system.web中的配置部分http://msdn.microsoft.com/en-us/library/system.web.configuration.compilationsection.tempdirectory%28VS.80%29.aspx中更改临时ASP.NET文件所在的文件夹

<compilation tempDirectory="D:\MoveThemHere">

答案 1 :(得分:1)

我知道这是一个老问题,但是如果有人仍然需要它,那么这就是C#代码。我想移植到PowerShell并不难。

datetimefield

HashCode类:

        string siteId = "/LM/W3SVC/3/ROOT"; // This can be composed by getting the site ID using the ServerManager (Microsoft.Web.Administration)
        string physicalPath = "E:\\home\\mysite\\web\\";

        string v_app_name = HashCode.GetString32((siteId + physicalPath).ToLower(CultureInfo.InvariantCulture)).ToString("x", CultureInfo.InvariantCulture);

        string dir_name_32_bits_app = HashCode.GetString32(v_app_name).ToString("x8");
        string dir_name_64_bits_app = HashCode.GetString64(v_app_name).ToString("x8");

        Console.WriteLine("32 bits: " + dir_name_32_bits_app);
        Console.WriteLine("64 bits: " + dir_name_64_bits_app);