程序化地访问(所有)网站上的ASP.Net页面?

时间:2009-09-18 14:45:41

标签: asp.net .net-3.5

在ASP.Net网站(.Net 3.5)的安全模型中,我们存储了页面名称:

page.GetType()。名称

作为数据库表中的主键,以便能够在用户有权访问某个页面时进行查找。第一次访问页面时,此记录将自动在数据库中创建。

我们已导出这些数据库语句以插入脚本,但每次创建新页面时我们都必须更新脚本,而不是一个大问题,但我想找到一种自动执行此操作的方法。

我创建了一个标记了几个页面的属性,然后编写了一个小进程来获取具有此属性的所有对象,通过反射创建一个实例并使用相同的代码插入记录以用于上面提到的页面记录:

IEnumerable<Type> viewsecurityPages = Assembly.GetExecutingAssembly().GetTypes().Where(t => t.IsDefined(typeof(ViewSecurityAttribute),false));

            foreach (Type t in viewsecurityPages)
            {
                object obj = Activator.CreateInstance(t, false);

           //clip..(This code just checks if the record already exists in the DB)

                if (feature == null)
                {

                    Attribute attb = Attribute.GetCustomAttribute(t, typeof(ViewSecurityAttribute));

                    if (attb != null)
                    {
                        CreateSecurableFeatureForPage((Page)obj, uow, attb.ToString());
                    }

                }

            }

问题是page.GetType()。当页面经过实际页面循环过程时的名称是这样的:

search_accounts_aspx

但是当我使用上面的激活方法时,它返回:

帐户

因此记录与安全表中的记录不匹配。无论如何,以程序方式“访问”一个网页,使其经历实际的页面生命周期,我会从Name参数中找回正确的值吗?

非常感谢任何帮助/参考。

1 个答案:

答案 0 :(得分:0)

有趣的问题......

当然有一种(太明显的?)方式以编程方式访问该页面...使用System.Net.HttpWebRequest。当然,这需要URI而不仅仅是对象的句柄。这是“我们如何从这里到达那里?”问题

我的建议是简单地创建另一个属性(或使用相同的属性)来存储您需要的标识符。然后它会以同样的方式访问它,对吧?

或者......为什么不使用第三方网络蜘蛛/抓取工具抓取您的网站并点击所有网页?有几个免费选项。或者我错过了什么?