简体   繁体   English

发布后会话丢失(在开发机上工作)

[英]Session getting lost after publishing (works on dev machine)

I'm working on a Holiday Tracker application and one specific thing is killing the whole "page life cycle". 我正在开发一个Holiday Tracker应用程序,其中一件特别的事是杀死整个“页面生命周期”。

In my User Scheduler, where every user can insert his vacation, sometimes it's working (and so he can insert/delete/edit and view his vacation). 在我的用户计划程序中,每个用户都可以在其中插入休假,有时它可以正常工作(因此他可以插入/删除/编辑并查看休假)。 There is also a Vacation page (same story there, just with a grid). 还有一个“假期”页面(那里是相同的故事,只是带有网格)。

But sometimes the session that is set is getting lost. 但是有时设置的会话会丢失。 If I'm debugging with Visual Studio 2012, it's working. 如果我正在使用Visual Studio 2012进行调试,则可以正常工作。 But if I publish the application, it's not working. 但是,如果我发布该应用程序,它将无法正常工作。 It just gets lost somehow 它只是以某种方式迷路了

Code in Global.asax.cs Global.asax.cs中的代码

    void Session_Start(object sender, EventArgs e) {
        // Code that runs when a new session is started
        if (HttpContext.Current.User != null && HttpContext.Current.User is HtUser)
        {
            HtUser user = (HtUser)HttpContext.Current.User;
            Session["UserId"] = user.UserId;
            if(user.HtDepartments.Any() && user.HtDepartments.First().HtBusinessUnit != null){
                int BusinessUnitId  = user.HtDepartments.First().HtBusinessUnit.BusinessUnitId;
                Session["BusinessUnitId"] = BusinessUnitId;
            }

        }
    }

I think that maybe the error is there. 我认为可能是错误所在。

Scheduler: 调度程序:

<%--<telerik:RadAjaxPanel ID="RadAjaxPanel1" runat="server" LoadingPanelID="RadAjaxLoadingPanel1">--%>

        <div style="float: left; margin-right: 20px; margin-bottom: 10px;">
            <asp:Label runat="server" Text="Unbooked vacation:"></asp:Label>
            <asp:Label ID="lblBookedVacation" runat="server" Text=""></asp:Label>
        </div>

        <div style="float: right; margin-right: 20px; margin-bottom: 10px;">
            <asp:Button runat="server" ID="btnExport" Text="Export to Lotus Notes" OnClientClick="Export(this, event); return false;" OnClick="btnExport_Click"></asp:Button>
        </div>
        <div style="clear: both;" />
        <div>
            <telerik:RadScheduler runat="server" ID="RadScheduler1" Width="750px" Height="700px"
                DayStartTime="07:00:00" DayEndTime="18:00:00" SelectedView="WeekView" DataSourceID="dsVactationDays"
                DataKeyField="VacationDayId" DataSubjectField="Title" DataStartField="FromDate" DataEndField="ToDate" OnAppointmentUpdate="RadScheduler1_AppointmentUpdate"
                OnAppointmentInsert="RadScheduler1_AppointmentInsert"
                OnRecurrenceExceptionCreated="RadScheduler1_RecurrenceExceptionCreated" OnTimeSlotCreated="RadScheduler1_TimeSlotCreated" OnAppointmentDataBound="RadScheduler1_AppointmentDataBound">
                <AdvancedForm Modal="true"></AdvancedForm>
                <TimelineView UserSelectable="false"></TimelineView>
                <TimeSlotContextMenuSettings EnableDefault="true"></TimeSlotContextMenuSettings>
                <AppointmentContextMenuSettings EnableDefault="true"></AppointmentContextMenuSettings>
            </telerik:RadScheduler>
        </div>
        <asp:TextBox ID="txtID" runat="server"></asp:TextBox>
        <asp:DataGrid runat="server" DataSourceID="dsVactationDays" AutoGenerateColumns="true"></asp:DataGrid>

        <asp:EntityDataSource ID="dsVactationDays" runat="server" ConnectionString="name=HolidayTrackerEntities" DefaultContainerName="HolidayTrackerEntities"
            EnableDelete="True" EnableFlattening="False" EnableInsert="True" EnableUpdate="True" EntitySetName="HtVacationDays"
            Where="it.UserId == @UserId">
            <WhereParameters>
                <asp:SessionParameter DbType="Int32" Name="UserId" SessionField="UserId" />
            </WhereParameters>
        </asp:EntityDataSource>

    <%--</telerik:RadAjaxPanel>--%>

Code behind 后面的代码

   private const int AppointmentsLimit = 1;
       // private HtUser paramUser;
        private HtUser user;
        private HtUser User
        {
            get
            {
                if (user == null)
                {
                    user = HtUser.INIT_USER(this.Page, false);
                }
                return user;
            }
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack) {
                if (this.User != null) {
                    updateUnbookedVacationNotification();
                }
            }
            txtID.Text = Session["UserId"] != null ? Session["UserId"].ToString() : "FUUUUU";
        }

        private void updateUnbookedVacationNotification() {
            double avAmount = User.GetAnnualVacationAmountByYear(this.RadScheduler1.SelectedDate.Year);
            double bookedAmount = User.GetBookedVacation(this.RadScheduler1.SelectedDate.Year);
            this.lblBookedVacation.Text = (avAmount - bookedAmount).ToString();
        }

        //private void getParameters()
        //{
        //    if (Page.Request["UserId"] != null)
        //    {
        //        int userId = Constants.TryConvert(Page.Request["userId"], this.Page);
        //        this.paramUser = HtUser.GetById(userId);
        //    }

        //}
        private bool ExceedsLimit(Appointment apt)
        {
            int appointmentsCount = 0;
            foreach (Appointment existingApt in RadScheduler1.Appointments.GetAppointmentsInRange(apt.Start, apt.End))
            {
                if (existingApt.Visible)
                    appointmentsCount++;
            }

            return (appointmentsCount > AppointmentsLimit - 1);
        }

        private bool AppointmentsOverlap(Appointment appointment)
        {
            if (ExceedsLimit(appointment))
            {
                foreach (Appointment a in RadScheduler1.Appointments.GetAppointmentsInRange(appointment.Start, appointment.End))
                {
                    if (a.ID != appointment.ID)
                    {
                        return true;
                    }
                }
            }



            return false;
        }

        private void RegisterScript()
        {
            Label1.Text = "Invalid move! There are appointments arranged for this time period.";
            ScriptManager.RegisterClientScriptBlock(this, GetType(), "LabelUpdated",
                    "$telerik.$('.lblError').show().animate({ opacity: 0.9 }, 2000).fadeOut('slow');", true);
        }


        protected void RadScheduler1_AppointmentInsert(object sender, SchedulerCancelEventArgs e)
        {
            if (ExceedsLimit(e.Appointment))
            {
                e.Cancel = true;
                RegisterScript();
            }
            else
            {
                int id = HtUser.GetUserIdByLogin(Page.User.Identity.Name);
                e.Appointment.Attributes.Add("UserId", id.ToString());
            }

        }

Login Part Global.asax.cs 登录零件Global.asax.cs

protected void WindowsAuthentication_OnAuthenticate(Object source, WindowsAuthenticationEventArgs e)
        {
            if (Request.Cookies.Get(Constants.AUTHORIZATION_COOKIE_NAME) != null)
                return;

            String strUserIdentity;
            FormsAuthenticationTicket formsAuthTicket;
            HttpCookie httpCook;
            String strEncryptedTicket;
            AdLookup adLookup = new AdLookup();

            strUserIdentity = e.Identity.Name;

            bool loggedIn = false;
            String email = null;
            String role = null;

            email = strUserIdentity; 
            HtUser userInfo = null;
            if (email != null && email != "")
            {
                userInfo = HtUser.GetByLogin(e.Identity, email);

                if (userInfo != null && userInfo.UserName.Length > 0)
                {
                    loggedIn = true;
                    role = HtUser.GetUserRoleString(userInfo);
                }
                //Checks if user is in domain
                else
                {
                    userInfo = adLookup.GetAdUserByUsername(HtUser.getUserNameFromDomainString(email));
                    if (userInfo != null && userInfo.UserName.Length > 0)
                    {
                        loggedIn = true;
                        role = UserRoles.User;
                    }
                }
            }
            //}

            if (loggedIn)
            {
                formsAuthTicket = new FormsAuthenticationTicket(1, email, DateTime.Now,
                                                                DateTime.Now.AddMinutes(60), false, role);
                strEncryptedTicket = FormsAuthentication.Encrypt(formsAuthTicket);
                httpCook = new HttpCookie(Constants.AUTHORIZATION_COOKIE_NAME, strEncryptedTicket);
                Response.Cookies.Add(httpCook);
                HttpContext.Current.User = userInfo;
            }
            else
            {
                HttpContext.Current.User = null;
            }

Web.Config Web配置

<?xml version="1.0" encoding="utf-8"?>
<!--
  For more information on how to configure your ASP.NET application, please visit
  http://go.microsoft.com/fwlink/?LinkId=169433
  -->
<configuration>
  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=4.4.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <connectionStrings>
    <add name="ApplicationServices" connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\aspnetdb.mdf;User Instance=true" providerName="System.Data.SqlClient" />
    <add name="ConnectionString" connectionString="Data Source=ch-s-0008086;Initial Catalog=HolidayTracker;Persist Security Info=True;User ID=sa;Password=123.;MultipleActiveResultSets=True" providerName="System.Data.SqlClient" />
    <add name="HolidayTrackerConnectionString" connectionString="Data Source=ch-s-0008086;Initial Catalog=HolidayTracker;User ID=sa;Password=123." providerName="System.Data.SqlClient" />
    <add name="HolidayTrackerEntities" connectionString="metadata=res://*/Model.HolidayTracker.csdl|res://*/Model.HolidayTracker.ssdl|res://*/Model.HolidayTracker.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=ch-s-0008086;Initial Catalog=HolidayTracker;Persist Security Info=True;User ID=sa;Password=123.;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" />
    <add name="HolidayTrackerEntities1" connectionString="metadata=res://*/DAL.HTTracker.csdl|res://*/DAL.HTTracker.ssdl|res://*/DAL.HTTracker.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=ch-s-0008086;initial catalog=HolidayTracker;user id=sa;password=123.;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />
  </connectionStrings>
  <appSettings>
    <add key="LDAP_SERVER_NAME" value="asdasdasd" />
    <add key="LDAP_USERNAME" value="asdasdas" />
    <add key="LDAP_PASSWORD" value="asdasdasd" />
  </appSettings>
  <system.web>
    <compilation debug="true" targetFramework="4.0">
      <assemblies>
        <add assembly="System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A" />
        <add assembly="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" />
        <add assembly="System.Speech, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        <add assembly="System.Web.Entity, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" />
        <add assembly="System.Data.Entity, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
        <add assembly="System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        <add assembly="System.Runtime.Serialization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" />
        <add assembly="System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" />
        <add assembly="System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" />
        <add assembly="System.Xml.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" />
        <add assembly="System.Data.DataSetExtensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" />
        <add assembly="System.Web.Extensions.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
      </assemblies>
    </compilation>
    <customErrors mode="Off" />
    <authentication mode="Windows" />
    <identity impersonate="false" />
    <httpHandlers>
      <add path="ChartImage.axd" type="Telerik.Web.UI.ChartHttpHandler" verb="*" validate="false" />
      <add path="Telerik.Web.UI.SpellCheckHandler.axd" type="Telerik.Web.UI.SpellCheckHandler" verb="*" validate="false" />
      <add path="Telerik.Web.UI.DialogHandler.aspx" type="Telerik.Web.UI.DialogHandler" verb="*" validate="false" />
      <add path="Telerik.RadUploadProgressHandler.ashx" type="Telerik.Web.UI.RadUploadProgressHandler" verb="*" validate="false" />
      <add path="Telerik.Web.UI.WebResource.axd" type="Telerik.Web.UI.WebResource" verb="*" validate="false" />
    </httpHandlers>
    <pages>
      <controls>
        <add tagPrefix="telerik" namespace="Telerik.Web.UI" assembly="Telerik.Web.UI" />
      </controls>
    </pages>
    <httpModules>
      <add name="RadUploadModule" type="Telerik.Web.UI.RadUploadHttpModule" />
      <add name="RadCompression" type="Telerik.Web.UI.RadCompression" /></httpModules>
  </system.web>
  <system.webServer>
    <validation validateIntegratedModeConfiguration="false" />
    <modules runAllManagedModulesForAllRequests="true">
      <remove name="RadUploadModule" />

      <remove name="RadCompression" /><add name="RadUploadModule" type="Telerik.Web.UI.RadUploadHttpModule" preCondition="integratedMode" />
      <add name="RadCompression" type="Telerik.Web.UI.RadCompression" preCondition="integratedMode" /></modules>
    <handlers>
      <remove name="ChartImage_axd" />
      <remove name="Telerik_Web_UI_SpellCheckHandler_axd" />
      <remove name="Telerik_Web_UI_DialogHandler_aspx" />
      <remove name="Telerik_RadUploadProgressHandler_ashx" />
      <remove name="Telerik_Web_UI_WebResource_axd" />
      <add name="ChartImage_axd" path="ChartImage.axd" type="Telerik.Web.UI.ChartHttpHandler" verb="*" preCondition="integratedMode" />
      <add name="Telerik_Web_UI_SpellCheckHandler_axd" path="Telerik.Web.UI.SpellCheckHandler.axd" type="Telerik.Web.UI.SpellCheckHandler" verb="*" preCondition="integratedMode" />
      <add name="Telerik_Web_UI_DialogHandler_aspx" path="Telerik.Web.UI.DialogHandler.aspx" type="Telerik.Web.UI.DialogHandler" verb="*" preCondition="integratedMode" />
      <add name="Telerik_RadUploadProgressHandler_ashx" path="Telerik.RadUploadProgressHandler.ashx" type="Telerik.Web.UI.RadUploadProgressHandler" verb="*" preCondition="integratedMode" />
      <add name="Telerik_Web_UI_WebResource_axd" path="Telerik.Web.UI.WebResource.axd" type="Telerik.Web.UI.WebResource" verb="*" preCondition="integratedMode" />
    </handlers>
    <directoryBrowse enabled="true" />
  </system.webServer>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="v11.0" />
      </parameters>
    </defaultConnectionFactory>
  </entityFramework>
</configuration>

If you need something more, just let me know. 如果您还需要更多,请告诉我。

If you are using InProc session storage and publish your application, the application pool gets recycled by the IIS and the w3wp.exe process respawns. 如果您使用InProc会话存储并发布应用程序,则IIS将回收应用程序池,并重新生成w3wp.exe进程。 Your session data is then lost immediately. 您的会话数据随后会立即丢失。

If that is the problem you're having, and you want to avoid it, there are options for storing your session elsewhere (such as in a database). 如果这是您遇到的问题,并且想避免它,那么可以使用一些选项将会话存储在其他地方(例如数据库中)。 See the MSDN article on ASP.NET Session-State Modes for more information. 有关更多信息,请参见ASP.NET会话状态模式下的MSDN文章。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 会话变量在发布后丢失(在开发机器上工作) - Session variable gets lost after publishing (works on dev machine) MS Graph和AAD Graph Rest api在本地机器调试中工作正常,但在发布到Azure应用服务后获得禁止响应 - MS Graph and AAD Graph Rest api works fine in Local machine debugging but getting forbidden response after publishing to azure app service 登录后会话丢失 - Session lost after login 会话丢失后的Membership SettingsPropertyNotFoundException - Membership SettingsPropertyNotFoundException after session was lost 重定向页面后会话丢失 - Session lost after redirect page .net中的会话重新生成后,会话数据丢失 - session data lost after session regeneration in .net 程序可在开发机上运行,​​但无法在测试机上启动 - Program works on dev machine, but won't start on test machine 调用托管代码的非托管代码可在开发机上工作,而不在已部署的计算机上工作 - Unmanaged code calling managed code works on dev machine, not on deployed machine 在服务器上工作,但发布后出现错误 - On server works but after the publishing i get an error 从blob下载可在本地工作,但发布后则无法工作 - downloading from blob works locally but not after publishing
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM