簡體   English   中英

Server.Transfer導致會話異常

[英]Server.Transfer causing Session exception

在我的全局中,我有以下代碼來處理錯誤發生時

//[..] code goes here
  Server.Transfer("~/Error.aspx?ErrorID=" + errorId);

它曾經是一個Response.Redirect ,它完美地工作,除了它改變了url(這就是為什么我想使用Server.Transfer

不幸的是,現在當它嘗試加載錯誤頁面時,它在嘗試引用Session時在主頁面上崩潰

HttpException:
只有在配置文件或Page指令中將enableSessionState設置為true時,才能使用會話狀態。 還請確保System.Web.SessionStateModule或自定義會話狀態模塊包含在應用程序配置的\\\\部分中。

我的配置和頁面都有enableSessionState。

我還發現了一些建議使用Context.RewritePath的鏈接 - 這只會導致為我加載空白頁面。

使用Response.Redirect完美地按預期工作,所以我假設Server.Transfer是這里的問題。 它是什么?

編輯代碼:

protected void Application_Error(object sender, EventArgs e)
        {

            lock (_lockMe)
            {
                Exception ex = Server.GetLastError();

                if (ex != null)
                {
                    if (ex.InnerException != null)
                        ex = ex.InnerException;

                    ErrorLoggingManager.AddError(ex, new MembershipData(), ...); //etc
                }

                Server.ClearError();

                   //Some other database code for cleaning up some stuff when an error happens

                }

                try
                {
                    if (Response != null)
                    {
                        //Get the last error logged
                        MyDataContext db = new MyDataContext();
                        int errorId = db.LoggedErrors.OrderByDescending(le => le.ErrorId).Select(le => le.ErrorId).FirstOrDefault();

                        Server.Transfer("~/Error.aspx?ErrorID=" + errorId); 
                    }
                }
                catch (Exception)
                {
                }
            }

因為你還沒有發布很多代碼。 所以沒有看到你已經完成的實際實現。 我可以建議你低於分數。

要點1.首先,您需要檢查是否為頁面enabledSessionState 您可以在web.config文件中全局設置它們。 web.config嘗試下面給出的snippet

<configuration>   
   <system.web>
   <pages enableSessionState="true" />
  </system.web>
</configuration>

點2.並將您的Redirection放在Global.asax中的Application_Error中。

public void Application_Error(object sender, EventArgs e)
{
     HttpApplication app = (HttpApplication)sender;
     app.Server.Transfer("~/Error.aspx?ErrorID=" + errorId,true);
 }

要點3.同時檢查IIS也正確設置了SessionState

詳細信息在MSDN上以啟用sessionstate

希望這可以幫助..!!!

根據我的理解,Server.Transfer將另一個頁面的內容發送到客戶端而不是請求的內容。 如果是這種情況,那么我想知道它是否與將母版頁應用於錯誤頁面沒有關系? 幾年前我用早期的技術發生了類似的錯誤,結果發現主頁不喜歡我想做的事情。

我希望這有助於至少指出一個解決方案。

這是問題所在:

如果存在頁面呈現異常(例如“未找到文件”),則Server.Transfer會將會話搞砸。 這與在頁面渲染期間調用它有關。

只要您在錯誤發生之前沒有附加標題,Response.Redirect就可以正常工作; 但是,如果您使用Response.AppendHeader,則在頁面呈現期間Response.Redirect將不起作用。

請嘗試使用HttpContext.Current.RewritePath。 fix all these problems. 解決所有這些問題。 無論出於何種原因,RewritePath()並不關心頁面是否還沒有完成渲染。

為什么不在web.config中使用customErrors來進行重定向?

<customErrors mode="Off" defaultRedirect="~/Common/Error.aspx">
  <error statusCode="403" redirect="~/SM_AccessDenied.aspx" />
  <error statusCode="404" redirect="~/Common/FileNotFound.aspx" />
</customErrors>

我不久前在不同的背景下遇到了同樣的問題。 我不知道你的情況是否如此,但如果你在Windows 2008上使用IIS7,除了在web.config中設置enableSessionState=true ,你必須將你的模塊放在<system.webServer>部分中,而不是<system.web> 改變這個小東西為我解決了它。

你為什么不嘗試這樣:

Server.Transfer方法還有第二個參數 - “preserveForm”。 如果將此設置為True,則使用諸如Server.Transfer(“WebForm2.aspx”,True)之類的語句,現有查詢字符串和任何表單變量仍將可用於要傳輸到的頁面。

所以我認為這樣做你的會話不會過期。

Server.Transfer("~/Error.aspx?ErrorID=" + errorId,True);

您遇到的錯誤是因為您正在使用查詢字符串參數。 根據msdn文檔

However, the path parameter must not contain a query string, or ASP returns an error.

http://msdn.microsoft.com/en-us/library/ms525800%28v=vs.90%29.aspx

它大約在要求之上的頁面的3/4。

即使這里的文檔提到了asp。 而不是asp.net,請記住會話狀態是IIS的一個功能,並在調用asp.net之前處理。

@ user2110845:幾個月前我遇到過類似的問題。 問題在於網站名稱中有下划線。 我們在IIS中部署了一個具有兩個不同主機名的網站(通過網站上的“編輯綁定”選項添加兩個條目)。 提供的主機名是abc_ts,abc_is。 刪除下划線后,會話問題得到解決。 似乎網站主機名中不允許使用某些字符。 檢查這是不是你的問題。 我在這里找到了答案: 鏈接 (在文章中選中'更新2')

您沒有提到您正在使用的ASP.NET版本,但在2.0和3.5之間有一些變化,未處理的異常如何通過ASP.NET Web應用程序然后通過IIS進行冒泡。

在其他一些可能的情況下,當您清除錯誤時,您沒有設置Context.Response.TrySkipIisCustomErrors = true; 雖然這個特定的標志可能與您的問題無關(並且僅適用於3.5+),但它也可以幫助處理隱藏真實問題的幕后可能存在的兩個錯誤頁面。 無論如何,它會給你帶來很多悲傷(至少如果你運行3.5+)還有其他潛在的問題。 查看我幾年前寫的兩篇可能有用的帖子:雖然它們不包括會話處理,但它們確實涵蓋了我必須遵循的多個歌曲和舞蹈例程,以便在各種版本的ASP中獲得適當的500和404處理。凈。 你有可能遇到一些可以讓你更進一步的東西,如果不是那么一切。

http://www.andornot.com/blog/post/Errors-Sending-the-Right-Message-(Redux-Covering-ASPNET-3540).aspx

http://www.andornot.com/blog/post/Errors-Sending-the-Right-Message.aspx

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM