4

私のホスティング会社の Web サーバーは、クラスが [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 を使用していることを示します。これは、アプリケーションとは別のプロセスであり、セッション データの格納を担当します (これはおそらく、TempData 呼び出しに含まれているものです)。これは別のプロセスであるため、.NET がデータを出し入れする方法は、保存しようとしているものをシリアル化し、取得しようとしているものを逆シリアル化することです。したがって、本番セットアップでセッションに保存されたオブジェクトは、[シリアル化可能] とマークする必要があります。

于 2013-07-04T19:08:48.583 に答える