48

ルーティングHttpContext.Current.Sessionがなければ、そこにあるので、 が機能していることがわかりStateServerます。リクエストをHttpContext.Current.Sessionルーティングnullすると、ルーティングされたページにあります。MVC プレビューなしで、IIS 7.0 で .NET 3.5 sp1 を使用しています。ルートを使用するときに決して起動されないように見えるAcquireRequestStateため、セッション変数はインスタンス化/入力されません。

セッション変数にアクセスしようとすると、次のエラーが発生します。

base {System.Runtime.InteropServices.ExternalException} = {"Session state can only be used when enableSessionState is set to true, either in a configuration file or in the Page directive. Please also make sure that System.Web.SessionStateModule or a custom session state module is included in the <configuration>.

デバッグ中にHttpContext.Current.Session、そのコンテキストではアクセスできないというエラーも表示されます。

--

web.configはこのように見えます:

<configuration>
  ...
  <system.web>
    <pages enableSessionState="true">
      <controls>
        ...
      </controls>
    </pages>
    ...
  </system.web>
  <sessionState cookieless="AutoDetect" mode="StateServer" timeout="22" />
  ...
</configuration>

IRouteHandler の実装は次のとおりです。

public class WebPageRouteHandler : IRouteHandler, IRequiresSessionState
{
    public string m_VirtualPath { get; private set; }
    public bool m_CheckPhysicalUrlAccess { get; set; }

    public WebPageRouteHandler(string virtualPath) : this(virtualPath, false)
    {
    }
    public WebPageRouteHandler(string virtualPath, bool checkPhysicalUrlAccess)
    {
        m_VirtualPath = virtualPath;
        m_CheckPhysicalUrlAccess = checkPhysicalUrlAccess;
    }

    public IHttpHandler GetHttpHandler(RequestContext requestContext)
    {
        if (m_CheckPhysicalUrlAccess
            && !UrlAuthorizationModule.CheckUrlAccessForPrincipal(
                   m_VirtualPath,
                   requestContext.HttpContext.User,
                   requestContext.HttpContext.Request.HttpMethod))
        {
            throw new SecurityException();
        }

        string var = String.Empty;
        foreach (var value in requestContext.RouteData.Values)
        {
            requestContext.HttpContext.Items[value.Key] = value.Value;
        }

        Page page = BuildManager.CreateInstanceFromVirtualPath(
                        m_VirtualPath, 
                        typeof(Page)) as Page;// IHttpHandler;

        if (page != null)
        {
            return page;
        }
        return page;
    }
}

EnableSessionState="True"また、aspx ページの上部に配置しようとしましたが、まだ何もありません。

洞察はありますか?HttpRequestHandler実装する別のものを書く必要がありますIRequiresSessionStateか?

ありがとう。

4

11 に答える 11

55

とった。実際、かなり愚かです。次のようにSessionStateModuleを削除して追加した後、機能しました。

<configuration>
  ...
  <system.webServer>
    ...
    <modules>
      <remove name="Session" />
      <add name="Session" type="System.Web.SessionState.SessionStateModule"/>
      ...
    </modules>
  </system.webServer>
</configuration>

「セッション」はですでに定義されているはずなので、単に追加するだけでは機能しませんmachine.config

さて、それが普通のことなのかしら。とても粗雑に見えるので、確かにそうではないようです...

于 2008-10-21T09:01:32.333 に答える
24

web.configに属性runAllManagedModulesForAllRequests="true"を追加するだけです。system.webServer\modules

この属性は、MVCおよび動的データプロジェクトでデフォルトで有効になっています。

于 2008-12-19T15:46:56.837 に答える
16

runAllManagedModulesForAllRequests=true実際には本当に悪い解決策です。これにより、アプリケーションの読み込み時間が 200% 増加しました。より良い解決策は、セッション オブジェクトを手動で削除および追加し、すべてのマネージド モジュール属性をまとめて実行することを避けることです。

于 2011-06-21T17:00:04.393 に答える
3

良くやった!私はまったく同じ問題を抱えています。Session モジュールの追加と削除は、私にとっても完璧に機能しました。しかし、それは HttpContext.Current.User によって元に戻されなかったので、FormsAuth モジュールであなたの小さなトリックを試してみましたが、それで十分です。

<remove name="FormsAuthentication" />
<add name="FormsAuthentication" type="System.Web.Security.FormsAuthenticationModule"/>
于 2008-12-13T02:44:27.800 に答える
3

@Bogdan Maximが言ったこと。または、外部セッション状態サーバーを使用していない場合は、InProc を使用するように変更します。

<sessionState mode="InProc" timeout="20" cookieless="AutoDetect" />

SessionState ディレクティブの詳細については、こちらを参照してください。

于 2008-10-20T11:30:28.240 に答える
0

コードのこの部分はコンテキストを変更すると思います。

 Page page = BuildManager.CreateInstanceFromVirtualPath(
                        m_VirtualPath, 
                        typeof(Page)) as Page;// IHttpHandler;

また、コードのこの部分は役に立たない:

 if (page != null)
 {
     return page;
 }
 return page;

nullかどうかに関係なく、常にページが返されます。

于 2008-10-20T13:59:04.103 に答える
0

構成セクションは、ページが正常にアクセスされた場合に機能するため、健全に見えます。提案された他の構成を試しましたが、問題はまだ残っています。

ルーティングなしで機能するため、セッションプロバイダーに問題があるとは思えません。

于 2008-10-20T11:29:02.330 に答える
0

構成ファイルに状態サーバーのアドレスを追加するのを忘れているようです。

 <sessionstate mode="StateServer" timeout="20" server="127.0.0.1" port="42424" />
于 2008-10-20T11:10:19.547 に答える
0

セッション アダプターに System.web.mvc dll への参照がありませんでした。同じものを追加すると、問題が修正されました。

他の誰かが同じシナリオを経験するのに役立つことを願っています。

于 2012-10-07T20:27:58.723 に答える
-1

より良い解決策は

runAllManagedModulesForAllRequest は、セッション モジュールの削除と再挿入に関して賢明な方法です。

アルコール。

于 2009-10-28T17:55:50.533 に答える