4

我的托管公司的网络服务器一直抱怨该类未标记为 [Serializable]。

当我在本地主机上运行它时,它工作正常,没问题。一旦我将它上传到服务器,它就会要求我对其进行序列化?


示例类:

public class Notification
{
    public string Message { get; set; }
    public NotificationType NotificationType { get; set; }        

    public static Notification CreateSuccessNotification(string message)
    {
        return new Notification { Message = message, NotificationType = NotificationType.Success};
    }

    public static Notification CreateErrorNotification(string message)
    {
        return new Notification { Message = message, NotificationType = NotificationType.Error };
    }
}

我在基本控制器中使用。当重定向到另一个方法时,这个类存储在 TempData 中,这可能是原因吗?但是,为什么在服务器上而不是在我的本地计算机上?

public abstract class BaseController : Controller
{
    protected override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            _notifications = TempData["Notifications"] == null ? new List<Notification>() : (List<Notification>)TempData["Notifications"];
            _model = TempData["Model"];
            base.OnActionExecuting(filterContext);
        }

        protected override void OnResultExecuting(ResultExecutingContext filterContext)
        {
            if (filterContext.Result is RedirectToRouteResult)
            { 
                if (_model != null)
                    TempData["Model"] = _model;
                if (_notifications.Count > 0)
                    TempData["Notifications"] = _notifications;
            }

            base.OnResultExecuting(filterContext);
        }
}

如果需要,覆盖此控制器的控制器只需添加通知和模型,然后重定向到另一个操作。

4

2 回答 2

3

在您的 web.config 中,有一个类似的部分

<sessionState mode="InProc" cookieless="false" timeout="60" />

这指定您的应用程序将使用 Controller 的 Session 属性作为与您的应用程序相同的进程中的数据结构。在服务器上,该部分很可能看起来像

<sessionState mode="StateServer" stateConnectionString="tcpip=someIPAddress" cookieless="false" timeout="60" />

此标记指定您正在使用 ASP.Net StateServer,这是一个独立于您的应用程序的进程,负责存储 Session 数据(这可能是您的 TempData 调用中的内容)。由于它是另一个进程,因此 .NET 将数据传入和传出的方式是序列化您尝试存储的内容并反序列化您尝试检索的内容。因此,在生产设置中存储在 Session 中的对象需要标记为 [Serializable]。

于 2013-07-04T19:08:48.583 回答
2

我想这与您的会话状态提供程序有关。对于本地,这可能是在内存中,但在您的主机上,它将使用一些进程外机制来支持多服务器。

于 2013-07-04T19:08:59.453 回答