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

Does MvcSiteMapProvider support "Sql Server" session state?

我正在尝试在配置有 SqlServer 会话状态模式的应用程序中使用 MvcSiteMapProvider。 但是,当我调用 XmlSiteMapController class 的 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);
}

然后我得到一个异常

Type 'System.Web.Routing.RouteValueDictionary' in Assembly 'System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' is not marked as serializable.

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

谢谢!

除非您对其进行了自定义,否则 MvcSiteMapProvider 不会以任何方式与会话状态交互。所以,它应该适用于任何会话状态模式(我没有用 SqlServer 模式测试它,所以如果你仍然遇到问题,我建议你打开一个 new issue about it). Please see How to Make MvcSiteMapProvider Remember a User's Position 来解释它在没有会话状态的情况下如何工作。

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

附带说明一下,只要安装了 MvcSiteMapProvider.MVC4 NuGet 程序包,就无需从 MVC 4 应用程序显式调用 XmlSiteMapController.RegisterRoutes。使用 WebActivator 自动调用此方法。调用它两次可能会遇到问题。

MvcSiteMapProvider 如果您出于任何原因想要将节点置于会话状态,则需要与状态服务器进行交互。我这样做是为了跟踪我与节点关联的对象,因为 MvcSiteMapProvider 会忘记每个新请求的任何状态信息。

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

如果你做一个替换

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

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

移除 JavaScriptSerializerAdapter class 的属性。

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