문제

라우팅없이 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?

감사.

도움이 되었습니까?

해결책

알았어요. 사실 꽤 바보. SESSIONSTATEMODULE을 제거하고 추가 한 후에 작동했습니다.

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

"세션"이 이미 machine.config.

이제 그것이 평범한 일인지 궁금합니다. 너무 조잡한 것처럼 보이기 때문에 분명히 보이지 않습니다 ...

다른 팁

속성을 추가하십시오 runAllManagedModulesForAllRequests="true" 에게 system.webServer\modules web.config에서.

이 속성은 MVC 및 동적 데이터 프로젝트에서 기본적으로 활성화됩니다.

runAllManagedModulesForAllRequests=true 실제로는 진짜 나쁜 해결책입니다. 이로 인해 응용 프로그램의로드 시간이 200%증가했습니다. 더 나은 솔루션은 세션 객체를 수동으로 제거하고 추가하고 실행 된 모든 관리 모듈 속성을 모두 함께 피하는 것입니다.

이 솔루션 중 어느 것도 저에게 도움이되지 않았습니다. 다음 방법을 추가했습니다 global.asax.cs 그런 다음 세션은 null이 아닙니다.

protected void Application_PostAuthorizeRequest()
{
    HttpContext.Current.SetSessionStateBehavior(SessionStateBehavior.Required);
}

좋은 작업! 나는 똑같은 문제를 겪고 있습니다. 세션 모듈을 추가하고 제거하는 것도 완벽하게 작동했습니다. 그러나 그것은 httpcontext.current.user로 되돌아 가지 않았으므로 Formsauth 모듈로 당신의 작은 트릭을 시도했습니다.

<remove name="FormsAuthentication" />
<add name="FormsAuthentication" type="System.Web.Security.FormsAuthenticationModule"/>

@Bogdan Maxim이 말한 것. 또는 외부 Sesssion State Server를 사용하지 않는 경우 Inproc 사용 변경.

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

바라보다 여기 SessionState Directive에 대한 자세한 정보.

상태 서버 주소를 추가하는 것을 잊어 버린 것 같습니다. 구성 파일.

 <sessionstate mode="StateServer" timeout="20" server="127.0.0.1" port="42424" />

페이지가 정상적으로 액세스하는 경우 구성 섹션이 작동하는 것처럼 보입니다. 제안 된 다른 구성을 시도했지만 문제는 여전히 있습니다.

라우팅없이 작동하기 때문에 문제가 세션 제공 업체에 있다고 의심합니다.

코드 의이 부분이 컨텍스트를 변경한다고 생각합니다.

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

또한 코드 의이 부분은 쓸모가 없습니다.

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

그것은 항상 페이지를 보유한 페이지를 반환합니다.

더 나은 솔루션은입니다

runAllManagedModulesforAllRequest는 세션 모듈을 제거하고 다시 제기하는 것을 존중하는 영리한 일입니다.

알크.

세션 어댑터에 System.web.mvc DLL에 대한 참조가 누락되었고 동일한 문제를 추가하여 문제를 추가했습니다.

바라건대 다른 사람이 같은 시나리오를 겪는 데 도움이되기를 바랍니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top