IT

HttpContext.현재의.라우팅 요청 시 세션이 null입니다.

itgroup 2023. 10. 30. 20:54
반응형

HttpContext.현재의.라우팅 요청 시 세션이 null입니다.

루팅이 없으면,HttpContext.Current.Session그래서 나는 그것을 알고 있습니다.StateServer작동 중입니다.제가 요청을 전달할 때,HttpContext.Current.Sessionnull루티드 페이지에사용하고 있습니다.MVC 미리보기가 없는 IIS 7.0의 NET 3.5 sp1.는 것으로 보입니다.AcquireRequestState경로를 사용할 때 실행되지 않으므로 세션 변수가 인스턴스화/채워지지 않습니다.

Session 변수에 액세스하려고 하면 다음과 같은 오류가 나타납니다.

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?

감사해요.

알았어요, 사실 꽤 바보같군요.SessionState Module을 제거하고 추가한 후에는 다음과 같이 작동했습니다.

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

"Session"이 이미 정의되어 있어야 했기 때문에 단순히 추가하는 것은 효과가 없을 것입니다.machine.config.

자, 저는 그것이 보통 하는 일인지.너무 조잡한 것 같아서 그럴 것 같지는 않은데요...

속성만 추가runAllManagedModulesForAllRequests="true"로.system.webServer\modulesweb.config에서.

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

runAllManagedModulesForAllRequests=true정말 나쁜 해결책입니다이로 인해 애플리케이션 로드 시간이 200% 증가했습니다.더 나은 해결책은 세션 개체를 수동으로 제거하고 추가하는 것이며 관리되는 모든 모듈 속성을 모두 함께 실행하지 않는 것입니다.

이 어떤 해결책도 제게 도움이 되지 않았습니다.다음 방법을 추가했습니다.global.asax.cs세션이 null이 아니었습니다.

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

@Bogdan Maxim이 한 말.또는 외부 세션 상태 서버를 사용하지 않는 경우 InProc를 사용하도록 변경합니다.

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

세션 상태 지침에 대한 자세한 내용은 여기를 참조하십시오.

잘했어요!저도 똑같은 문제를 겪고 있습니다.세션 모듈을 추가하고 제거하는 것은 저에게도 완벽하게 효과가 있었습니다.그러나 그것은 HttpContext에 의해 다시 돌아오지 않았습니다.현재의.사용자가 양식을 가지고 당신의 작은 속임수를 시도해 봤습니다.Auth module 그리고 확실히, 그것은 해냈습니다.

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

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

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

페이지가 정상적으로 액세스될 때 구성 섹션이 작동하기 때문에 건전한 것으로 보입니다.제안된 다른 구성을 시도해 보았지만 여전히 문제가 있습니다.

라우팅 없이 작동하기 때문에 Session provider에 문제가 있는 것은 아닌지 의심됩니다.

코드의 이 부분이 문맥에 변화를 준다고 생각합니다.

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

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

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

항상 페이지가 null인지 아닌지를 반환합니다.

시스템에 대한 참조를 놓쳤습니다.세션 어댑터에서 web.mvc dll을 추가하여 문제를 해결했습니다.

그것이 같은 시나리오를 겪는 다른 사람에게 도움이 되기를 바랍니다.

더 좋은 해결책은

runAllManagedModulesForAllRequest는 세션 모듈을 제거하고 다시 삽입하는 것과 관련하여 현명한 작업입니다.

지껄이는

언급URL : https://stackoverflow.com/questions/218057/httpcontext-current-session-is-null-when-routing-requests

반응형