2

カスタム RootConstraint クラスの Session に到達できません。null に設定されています。検索しましたが、解決策が見つかりませんでした。

public class AdminRootConstraint : IRouteConstraint
{
    public bool Match
        (
            HttpContextBase httpContext,
            Route route,
            string parameterName,
            RouteValueDictionary values,
            RouteDirection routeDirection
        )
    {
        if ((string) values["controller"] == "Login")
            return true;

        return HttpContext.Current.Session != null && (bool)HttpContext.Current.Session["IsAuthorized"];
    }
}

編集

httpContext パラメータがイミディエイト ウィンドウでどのように表示されるかを次に示します。アイデアを出すかもしれません。

httpContext
{System.Web.HttpContextWrapper}
    [System.Web.HttpContextWrapper]: {System.Web.HttpContextWrapper}
    AllErrors: null
    AllowAsyncDuringSyncStages: false
    Application: {System.Web.HttpApplicationStateWrapper}
    ApplicationInstance: {ASP.global_asax}
    AsyncPreloadMode: None
    Cache: {System.Web.Caching.Cache}
    CurrentHandler: null
    CurrentNotification: ResolveRequestCache
    Error: null
    Handler: null
    IsCustomErrorEnabled: false
    IsDebuggingEnabled: true
    IsPostNotification: true
    IsWebSocketRequest: false
    IsWebSocketRequestUpgrading: false
    Items: Count = 0x00000000
    PageInstrumentation: {System.Web.Instrumentation.PageInstrumentationService}
    PreviousHandler: null
    Profile: null
    Request: {System.Web.HttpRequestWrapper}
    Response: {System.Web.HttpResponseWrapper}
    Server: {System.Web.HttpServerUtilityWrapper}
    Session: null
    SkipAuthorization: false
    ThreadAbortOnTimeout: true
    Timestamp: {14.09.2013 16:52:53}
    Trace: {System.Web.TraceContext}
    User: {System.Security.Principal.WindowsPrincipal}
    WebSocketNegotiatedProtocol: null
    WebSocketRequestedProtocols: null

編集 2

RedirectToAction同じエリアのアクションからメソッドを使用していますが、Matchトレース中にメソッドが 2 回実行されます。最初の実行では、routeDirectionパラメーターは に設定されSystem.Web.Routing.RouteDirection.UrlGeneration、その時点でセッションは null ではありません。しかし、2 回目の実行が開始されると、routeDirectionパラメーターが に設定されSystem.Web.Routing.RouteDirection.IncomingRequest、セッションは null になります。なんで?

4

2 に答える 2

2

初めて Match が呼び出されるのは、MVC が (HTTP 302 を送信することによって) ユーザーのブラウザーをナビゲートする URL を作成しているためです。今回は、その瞬間に存在するという理由だけで、偶然にセッションが発生します。

2 回目に Match が呼び出されるのは、リクエストがブラウザに届いたときです。今回は、セッションがロードされる前にルーティング ロジックが実行されるため、セッションは存在しません。たとえば、ルーティングによって、セッションをまったく必要としないページがレンダリングされる場合があります。

結論として、セッションは IRouteConstraint でアクセスできないため、使用しないでください。

于 2015-04-17T14:29:36.037 に答える
0

通常、セッションにアクセスできる必要があります。ただし、ASP.NET MVC アプリケーションでは、HttpContext.Current静的プロパティを使用しないでください。HttpContextBase代わりに提供された抽象化を使用してください。

public class AdminRootConstraint : IRouteConstraint
{
    public bool Match
    (
        HttpContextBase httpContext,
        Route route,
        string parameterName,
        RouteValueDictionary values,
        RouteDirection routeDirection
    )
    {
        if ((string) values["controller"] == "Login")
        {
            return true;
        }

        object isAuthorized = httpContext.Session["IsAuthorized"];
        return (isAuthorized != null && (bool)isAuthorized);
    }
}

この例httpContext.Sessionでは、null にはなりません。null になる可能性があるhttpContext.Session["IsAuthorized"]のは、セッションでこのキーの値を設定しない場合は正常です。

于 2013-09-14T12:55:14.930 に答える