MVC 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);
        }
}

Контроллер, переопределяющий этот, просто добавляет уведомления и модель, если это необходимо, а затем перенаправляет на другое действие.


person Patrick    schedule 04.07.2013    source источник


Ответы (2)


В вашем web.config есть такой раздел, как

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

это указывает, что ваше приложение будет принимать свойство Session контроллера как структуру данных в том же процессе, что и ваше приложение. На сервере с большой долей вероятности раздел выглядит так

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

Этот тег указывает, что вы используете ASP.Net StateServer, отдельный от вашего приложения процесс, который отвечает за хранение данных сеанса (вероятно, это то, что находится в вашем вызове TempData). Поскольку это другой процесс, способ, которым .NET передает данные туда и обратно, заключается в сериализации того, что вы пытаетесь сохранить, и десериализации того, что вы пытаетесь получить. Следовательно, объекты, хранящиеся в Session в вашей производственной установке, должны быть помечены как [Serializable].

person welegan    schedule 04.07.2013
comment
есть ли способ для локального хоста имитировать поведение сервера? так что, если я не установлю класс сериализуемым, он выдаст ту же ошибку? - person NicoTek♦; 18.10.2016

Я предполагаю, что это связано с вашим поставщиком состояния сеанса. Для локального это, вероятно, в памяти, но на вашем хосте будет использоваться какой-то внепроцессный механизм для поддержки нескольких серверов.

person Mike Goodwin    schedule 04.07.2013