Nic*_*ver 8 c# sitemap asp.net .net-4.0 asp.net-4.0
我遇到了将项目升级到.Net 4.0的问题......并且无法找到问题的任何原因(或者至少是导致问题的变化).鉴于4.0的新鲜感,目前还没有很多关于问题的博客,所以我希望有人在这里有一个想法.前言:这是一个Web Forms应用程序,从3.5 SP1到4.0.
在Application_Start事件我们迭代通过网站地图,并有构建基于路由关数据(有一些工具添加美化网址居多),这部分是不是失败,但...或者至少不是没有得到那么远.
似乎调用SiteMap.RootNode(在application_start中)导致4.0吃它,因为XmlSiteMapProvider.GetNodeFromXmlNode方法已经改变,看着反射器你可以看到它在HttpResponse.ApplyAppPathModifier这里击中:
str2 = HttpContext.Current.Response.ApplyAppPathModifier(str2);
Run Code Online (Sandbox Code Playgroud)
HttpResponse 在2.0 CLR中这个方法根本没有使用过,所以我们在4.0中工作得很好,但是这个方法是由于这个堆栈调用的:
[HttpException (0x80004005): Response is not available in this context.]
System.Web.XmlSiteMapProvider.GetNodeFromXmlNode(XmlNode xmlNode, Queue queue)
System.Web.XmlSiteMapProvider.ConvertFromXmlNode(Queue queue)
System.Web.XmlSiteMapProvider.BuildSiteMap()
System.Web.XmlSiteMapProvider.get_RootNode()
System.Web.SiteMap.get_RootNode()
Run Code Online (Sandbox Code Playgroud)
由于Response4.0中没有此版本,因此出现错误.要重现这一点,您可以将测试用例缩小到全局:
protected void Application_Start(object sender, EventArgs e)
{
var s = SiteMap.RootNode; //Kaboom!
//or just var r = Context.Response;
//or var r = HttpContext.Current.Response;
//all result in the same "not available" error
}
Run Code Online (Sandbox Code Playgroud)
问题:我错过了一些明显的东西吗? 或者,是否在4.0中添加了另一个事件,建议在启动时与SiteMap相关的任何事件?
对于任何好奇/愿意帮助的人,我创建了一个非常小的项目(默认的VS 2010 ASP.Net 4.0站点,删除了所有的铃声和口哨,只添加了一个空白的站点地图和Application_Start代码).这是一个10kb的小拉链:http://www.ncraver.com/Test/SiteMapTest.zip
这不是一个很好的解决方案,但目前的解决方案是完成工作Application_BeginRequest,如下所示:
private static bool routesRegistered = false;
protected void Application_BeginRequest(object sender, EventArgs e)
{
if (!routesRegistered)
{
Application.Lock();
if (!routesRegistered) RouteManager.RegisterRoutes(RouteTable.Routes);
routesRegistered = true;
Application.UnLock();
}
}
Run Code Online (Sandbox Code Playgroud)
我特别不喜欢这种情况,感觉就像是滥用事件来绕过这个问题.有没有人至少有一个更好的解决办法,因为SiteMap的.Net 4行为不太可能改变?
由于此处没有任何活动,请将此作为后续接受的答案,希望它可以帮助其他人:
我当前的解决方案(真正的解决方法)是执行SiteMap相关的初始化工作,Application_BeginRequest并检查它是否发生一次,如下所示:
private static bool routesRegistered = false;
protected void Application_BeginRequest(object sender, EventArgs e)
{
if (!routesRegistered)
{
Application.Lock();
if (!routesRegistered) RouteManager.RegisterRoutes(RouteTable.Routes);
routesRegistered = true;
Application.UnLock();
}
}
Run Code Online (Sandbox Code Playgroud)
如果没有人在一周内用更好的方法回应我会接受这个,但我希望有一个更好的方法/我错过的东西.