2013-07-04 3 views
4

Веб-сервер моей хостинговой компании продолжает жаловаться, что класс не помечен как [Serializable].MVC 4 Почему мне приходится сериализоваться на сервере, но не локально?

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


Пример Класс:

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

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

ответ

3

В вашем 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 получает данные туда и снаружи, заключается в сериализации того, что вы пытаетесь сохранить и десериализовать то, что вы пытаетесь извлечь. Следовательно, объекты, хранящиеся в сеансе в вашей производственной установке, должны быть отмечены [Serializable].

+0

есть ли способ для localhost, чтобы имитировать поведение, как на сервере? так что, если я не установлю класс для сериализации, он будет вызывать ту же ошибку? – NicoTek

2

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