【问题标题】:How to check for URL re-write rule at runtime?如何在运行时检查 URL 重写规则?
【发布时间】:2014-05-30 15:02:19
【问题描述】:

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

我试过玩

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

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

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

【问题讨论】:

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


    【解决方案1】:

    对于存储在 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()));
        }
    }
    

    【讨论】:

    • 只有在 web.config 中添加了规则时才有效。我想检查规则是否通过 IIS 管理器添加为“入站规则”。不过还是谢谢。
    • 如您所说,我被拒绝访问。如果您不介意,我会要求您附加原始回复以阅读 web.config 重写规则,以防万一它可能对其他人有所帮助。感谢您的帮助。
    猜你喜欢
    • 2019-08-19
    • 2018-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多