MvcSiteMapProvider是否支持" Sql Server"会话状态?

时间:2015-05-11 16:35:29

标签: mvcsitemapprovider

我正在尝试在使用 SqlServer 会话状态模式配置的应用程序中使用MvcSiteMapProvider。 但是,当我调用 XmlSiteMapController 类的 RegisterRoutes 方法时,我得到一个例外,如下所示:

public static void RegisterRoutes(RouteCollection routes)
{
    // ...
    routes.MapRoute(
        "Default",
        "{controller}/{action}/{id}",
        new { controller = "Home", action = "Index", id = "" }
        );

    // Add our route registration for MvcSiteMapProvider sitemaps
    MvcSiteMapProvider.Web.Mvc.XmlSiteMapController.RegisterRoutes(routes);
}

然后我得到一个例外

  

键入' System.Web.Routing.RouteValueDictionary'在Assembly&System;系统中,版本= 4.0.0.0,文化=中性,   公钥= b03f5f7f11d50a3a'未标记为可序列化。

这让我觉得MvcSiteMapProvider不支持SqlServer会话状态模式。是吗?

谢谢!

2 个答案:

答案 0 :(得分:0)

除非您已对其进行自定义,否则MvcSiteMapProvider不会以任何方式与会话状态进行交互。因此,它应该适用于任何会话状态模式(我还没有用SqlServer模式测试它,所以如果你继续遇到问题,我建议你打开一个关于它的new issue。有关如何在没有会话状态的情况下工作的说明,请参阅How to Make MvcSiteMapProvider Remember a User's Position

发布的错误表明您的应用正在尝试序列化System.Web.Routing.RouteValueDictionary,这不是MvcSiteMapProvider所做的事情。

另外,只要您安装了XmlSiteMapController.RegisterRoutes NuGet包,就不需要从MVC 4应用程序中明确调用MvcSiteMapProvider.MVC4。使用WebActivator自动调用此方法。您可能会通过两次调用来解决问题。

答案 1 :(得分:0)

如果您想出于任何原因将节点置于会话状态,

MvcSiteMapProvider将需要与状态服务器进行交互。我这样做是为了跟踪我与节点关联的对象,因为MvcSiteMapProvider会在每次新请求时忘记任何状态信息。

如果您下载代码,则可以将项目添加到解决方案中。

如果你做了替换和

public class替换为[System.Serializable]\r\n\public class

同时将public abstract class替换为[System.Serializable]\r\n\public abstract class

JavaScriptSerializerAdapter类中删除该属性。

然后它将可用于状态服务器。