سؤال

ودون توجيه، HttpContext.Current.Session هناك حتى وأنا أعرف أن StateServer يعمل. عندما الطريق طلباتي، وHttpContext.Current.Session null في صفحة توجيهها. أنا أستخدم الصافي 3.5 SP1 على IIS 7.0، دون معاينات MVC. ويبدو أن 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 ثم كانت الدورة غير فارغة:

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 مكسيم. أو تغيير لاستخدام InProc إذا كنت لا تستخدم خادم دولة sesssion الخارجي.

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

هنا لمزيد من المعلومات حول التوجيه SessionState.

ويبدو أنك قد نسيت إضافة عنوان خادم دولتكم في التكوين ملف .

 <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 هو شيء ذكي للقيام احترام إزالة وحدة resinserting الدورة.

وALK.

وكنت في عداد المفقودين في اشارة الى System.web.mvc دلل في محول الدورة، وإضافة نفس إصلاح المشكلة.

ونأمل أن يساعد شخص آخر يمر بنفس السيناريو.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top