Проблема доступа к содержимому файлов WebResource.axd в коде - PullRequest
1 голос
/ 16 марта 2011

Я пытаюсь объединить все файлы CSS в один файл CSS.

Проблема в том, что файлы WebResource.axd включены.Я знаю, что могу сделать запрос http, чтобы получить его, но я также знаю, что должен иметь возможность получить его в AssemblyResourceLoader.

Формат URL-адреса - WebResource.axd? D = зашифрованный идентификатор & t = значение метки времени

Проблема, с которой я сталкиваюсь, заключается в расшифровке зашифрованного идентификатора, чтобы я мог получить css.

Любая помощь в получении расшифрованного идентификатора илиальтернативный метод получения содержимого веб-ресурса для страницы.

Спасибо

Обновление: Код, найденный для расшифровки идентификатора.Следующая проблема, которую нужно выяснить, - это доступ к контенту внутри ресурса.Вот расшифрованный код

public string DecryptWebResourceIdentifier(string urlEncodedData)
{

    byte[] encryptedData = HttpServerUtility.UrlTokenDecode(urlEncodedData);
    string decrypted="";
    Type machineKeySection = typeof(MachineKeySection);
    Type[] paramTypes = new Type[] { typeof(bool), typeof(byte[]), typeof(byte[]), typeof(int), typeof(int) };
    MethodInfo encryptOrDecryptData = machineKeySection.GetMethod("EncryptOrDecryptData", BindingFlags.Static | BindingFlags.NonPublic, null, paramTypes, null);
    try
    {
        byte[] decryptedData = (byte[])encryptOrDecryptData.Invoke(null, new object[] { false, encryptedData, null, 0, encryptedData.Length });
        decrypted = Encoding.UTF8.GetString(decryptedData);
    }
    catch
    {
    }
    return decrypted;
}

Ответы [ 3 ]

2 голосов
/ 16 марта 2011

Мне нужно предположить, что это может быть плохим подходом. Динамическое объединение CSS может тратить ресурсы и приложение может работать не так, как вы ожидаете.

Рекомендуемый подход - объединение CSS, сжатие JavaScript или любая оптимизация на стороне клиента во время сборки. Это управление MSBuild для выполнения задачи, которая должна комбинировать / сжимать CSS при компиляции приложения ASP.NET.

Вы можете использовать библиотеку Yahoo UI. У него есть порт для .NET:

И, наконец, вы можете реализовать очень простую задачу MSBuild, например:

<CombineCSS Files="@(CSSFiles)"  /> 

Таким образом, он выполнит код, который читает текст заданных путей к файлам (CSSFiles) и добавляет их в поток памяти, затем вы можете взять этот поток, преобразовать его в строку и сжать с помощью YUI.

Эта задача может быть добавлена ​​в исходный код разметки csproject MSBuild как дочерний узел события после сборки.

Вы получите файл типа «Style.css», который может содержать ВСЕ CSS-код из ВСЕХ файлов и с хорошим сжатием !!

1 голос
/ 21 марта 2012

Используя ваш метод DecryptWebResourceIdentifier , попробуйте следующий фрагмент кода:

string decryptedWebResourceIdentifier = DecryptWebResourceIdentifier(encryptedWebResourceIdentifier);
string assemblyName = null;
string resourceName = decryptedWebResourceIdentifier.Split("|")[1];
string resourceContent;

//Switch between assembly complete name and partial name
if (decryptedWebResourceIdentifier.Split("|")[0].Contains(",")) {
  assemblyName = string.Format("{0}, Version={1}, Culture={2}, PublicKeyToken={3}",   decryptedWebResourceIdentifier.Substring(1).Split("|")[0].Split(",")).Replace("Culture=,", "Culture=neutral,");
} else {
  assemblyName = decryptedWebResourceIdentifier.Split("|")[0].Substring(1);
}

//Gets resource assembly
Assembly resourceAssembly;

//If a assembly partial name is defined, get it's assembly reference or else, get current assembly
if (!string.IsNullOrEmpty(assemblyName)) {
  resourceAssembly = Assembly.Load(assemblyName);
} else {
  resourceAssembly = this.GetType().Assembly;
}

//Get resource stream and his content
resourceContent = new StreamReader(resourceAssembly.GetManifestResourceStream(resourceName)).ReadToEnd();
1 голос
/ 16 марта 2011
...