如何在运行时检查URL重写规则?

时间:2014-05-28 17:39:04

标签: c# asp.net configuration url-rewriting

有没有办法在运行时检查Web服务器上是否存在URL重写规则?

我尝试过玩

System.Configuration.Configuration config = System.Web.Configuration.WebConfigurationManager.OpenMachineConfiguration();

但是我收到一条错误,指出System.Configuration中不存在配置。

背景:Mads Kristensen展示了如何在TechEd中创建缓存破坏URL重写(在添加静态内容的过期时),但我的公司不允许我在web.config中添加规则,所以我必须得到sys管理员使用IIS管理器添加规则。问题是,现在我在本地计算机上没有这些规则,所以当我在本地运行站点时,静态内容不会加载。如果我可以检查规则是否存在于运行时,那么我可以跳过"指纹识别"这为我的静态内容提供了一个唯一的URL并放弃了重写。

1 个答案:

答案 0 :(得分:2)

对于存储在applicationHost.config(和redirection.config)中的全局IIS规则:

配置位于C:\ Windows \ System32 \ inetsrv \ config,您需要使用Microsoft.Web.Administration命名空间中的ServerManager类(需要引用位于C中的System.Web.Administration.dll: \ Windows \ System32下\ INETSRV)

using (ServerManager serverManager = new ServerManager())
{
     Configuration config = serverManager.GetWebConfiguration(); // or set application name 

     ConfigurationSection rulesSection = config.GetSection("system.webServer/rewrite/rules");
     ConfigurationElementCollection rulesCollection = rulesSection.GetCollection();

     foreach (var r in rulesCollection)
     {
         foreach (var c in r.ChildElements)
         {
            foreach (var a in c.Attributes)
                Response.Write(a.Name + "=" + a.Value);
         }
     }
}

默认情况下,用于应用程序池的应用程序标识可能没有足够的权限来读取该文件夹,您需要在强大的帐户下运行池,或者要求管理员分配当前帐户以读取配置文件。

对于存储在web.config中的规则:

在IIS7中,重写部分是system.webServer的一部分

Configuration webConfig = WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath); 
ConfigurationSection cs = webConfig.GetSection("system.webServer");
if (cs != null)
{
    XDocument xml = XDocument.Load(new StringReader(cs.SectionInformation.GetRawXml()));
    IEnumerable<XElement> rules = from c in xml.Descendants("rule") select c;

    foreach (XElement rule in rules)
    {
        Response.Write(Server.HtmlEncode(rule.ToString()));
    }
}