2011-03-16 42 views
1

我试图将所有css文件合并到一个css文件中。在代码中访问WebResource.axd文件内容的问题

麻烦的是获取WebResource.axd文件。我知道我可以做一个http请求来抓取它,但我也知道我应该能够在AssemblyResourceLoader中获取它。

URL格式是WebResource.axd的?d = 加密标识符 &吨= 时间戳值

问题IM饰面是获得加密标识符解密,这样我可以检索的CSS。

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

感谢

更新: 代码我发现解密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; 
} 

+0

我想出如何加密的标识符进行解码,现在我只是想弄清楚如何拉出与ID资源文本。 – zeal

回答

1
+0

那就是我试图做的,但我不知道资源名称。从阅读中我确定名字是在加密标识符,但我不知道如何解密它。 – zeal

+0

你有没有像[assembly:WebResource(“abc.js”,“application/x-javascript”)]在程序集中注册,那么名称是abc.js – Robert

+0

资源正在通过第三方控件添加,所以它不会不用查看反编译的代码就可以轻松找到名称。 – zeal

2

我需要建议你,这可能是个不错的办法。从根本上来说,组合CSS会浪费资源,应用程序可能无法达到您期望的效果。

推荐的方法是结合CSS,在构建时压缩JavaScript或任何客户端优化。这就是管理MSBuild来完成一项任务,无论何时编译ASP.NET应用程序,都必须组合/压缩CSS。

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

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

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

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

此任务可能会添加到csproject MSBuild标记源代码作为后生成事件的子节点。

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

+0

我的计划是结合所有的CSS文件,然后缓存文件的CSS文件。我有很多带有额外样式表的页面,无法添加到某些页面。所以我想动态创建压缩,然后缓存在第一页加载。 – zeal

+0

好吧,你可以结合一些CSS文件,而不是所有的文件。例如,您可以拥有“AdminArea.min.css”或“HomePage.min.css”等,但它们是N个文件的组合。 –

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();