Как определить \Temporary ASP.NET Files\root\{site hash} с помощью PowerShell?
ASP.NET использует каталог временных файлов для хранения файлов для теневого копирования и динамической компиляции. Типичный путь будет выглядеть следующим образом. Обратите внимание на хэш в конце пути.
C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\root\{hash}
Я использую автоматическое развертывание и заметил, что эти папки и их содержимое не удаляются автоматически. Я хотел бы автоматизировать процесс удаления неиспользуемых временных файлов как часть моего процесса развертывания. Таким образом, как только новая версия моего сайта будет развернута, старые временные файлы будут удалены.
Похоже, что хеш генерируется детерминированным образом, поэтому я надеюсь, что смогу определить хеш как часть моего сценария перед развертыванием и удалить его после развертывания.
Как рассчитывается хеш для веб-сайта ASP.NET?
Рекомендации:
2 ответа
Ну, через несколько минут с помощью Reflector поиск всех членов в System.Web по слову "Временный" показывает, что этот вызов приводит меня сюда:
string str2 = AppManagerAppDomainFactory.ConstructSimpleAppName(AppDomainAppVirtualPath);
Но потом я вспоминаю, что исходный код доступен для всех.NET, поэтому я перехожу к реальному коду, а не к отраженному коду: https://referencesource.microsoft.com/
Позже в этом методе "SetupCodeGenDirectory" путь создается поверх
this._codegenDir = Thread.GetDomain().DynamicDirectory;
Итак, похоже, что этот хэш взят из DynamicDirectory. Это здесь на http://referencesource.microsoft.com/, который выглядит как внешний вид, который находится внутри некоторых вещей COM Fusion Loader:
[ComImport,InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("7c23ff90-33af-11d3-95da-00a024a85b51")]
Но этот GUID приводит меня сюда http://referencesource.microsoft.com/
что подразумевает, что это часть токена открытого ключа:
public const uint HASH_VALUE = PUBLIC_KEY_TOKEN + 1;
public const uint NAME = HASH_VALUE + 1;
Это, возможно, это имя? Я предполагаю, что это yourAssembly.GetPublicKeyToken();
ИЛИ просто измените папку, в которой находятся ваши временные файлы ASP.NET, в разделе конфигурации http://msdn.microsoft.com/en-us/library/system.web.configuration.compilationsection.tempdirectory%28VS.80%29.aspx в system.web в web.config
<compilation tempDirectory="D:\MoveThemHere">
Я знаю, что это старый вопрос, но на тот случай, если он кому-то все еще нужен, это код C#, который делает свое дело. Я думаю, это не так сложно портировать на powershell.
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);
Класс HashCode:
public class HashCode
{
public static unsafe int GetString32(string s)
{
fixed (char* str = s)
{
char* chPtr = str;
int num = 0x15051505;
int num2 = num;
int* numPtr = (int*)chPtr;
for (int i = s.Length; i > 0; i -= 4)
{
num = (((num << 5) + num) + (num >> 0x1b)) ^ numPtr[0];
if (i <= 2)
{
break;
}
num2 = (((num2 << 5) + num2) + (num2 >> 0x1b)) ^ numPtr[1];
numPtr += 2;
}
return (num + (num2 * 0x5d588b65));
}
}
public static unsafe int GetString64(string s)
{
fixed (char* str = s)
{
int num3;
char* chPtr = str;
int num = 0x1505;
int num2 = num;
for (char* chPtr2 = chPtr; (num3 = chPtr2[0]) != '\0'; chPtr2 += 2)
{
num = ((num << 5) + num) ^ num3;
num3 = chPtr2[1];
if (num3 == 0)
{
break;
}
num2 = ((num2 << 5) + num2) ^ num3;
}
return (num + (num2 * 0x5d588b65));
}
}
}