1

我试图将所有 css 文件合并到一个 css 文件中。

问题在于包含 WebResource.axd 文件。我知道我可以发出一个 http 请求来获取它,但我也知道我应该能够在 AssemblyResourceLoader 中获取它。

url 格式为 WebResource.axd?d=加密标识符&t=时间戳值

我面临的问题是解密加密的标识符,以便我可以检索 css。

有关获取解密标识符或获取页面网络资源内容的替代方法的任何帮助。

谢谢

更新:我发现解密 id 的代码。下一个要解决的问题是访问资源中的内容。这是解密代码

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;
}

4

3 回答 3

2

我需要建议您,这可能是一个不好的方法。动态组合 CSS 可能会浪费资源,并且应用程序可能无法按您预期的方式运行。

推荐的方法是在构建时结合 CSS、压缩 JavaScript 或任何客户端优化。那就是管理 MSBuild 来执行一项任务,该任务必须在您编译 ASP.NET 应用程序时组合/压缩 CSS。

您可以使用 Yahoo UI 库。它有一个 .NET 端口:

最后,您可以像这样实现一个非常简单的 MSBuild 任务:

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

所以它会执行一段代码,读取给定文件路径(CSSFiles)的文本并将它们附加到内存流中,然后你可以获取这个流,将其转换为字符串并使用 YUI 压缩。

此任务可以作为构建后事件的子节点添加到 csproject MSBuild 标记源代码中。

你会得到一个像“Style.css”这样的文件,它可能包含来自所有文件的所有 CSS 代码并且具有良好的压缩!

于 2011-03-16T15:01:45.533 回答
1

使用您的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();
于 2012-03-20T21:03:18.753 回答
1

ClientScriptManager.GetWebResourceUrl 怎么样

http://msdn.microsoft.com/en-us/library/system.web.ui.clientscriptmanager.getwebresourceurl.aspx

于 2011-03-16T14:56:03.550 回答