#asp.net #sessionid #visual-studio-2010
#asp.net #идентификатор сеанса #visual-studio-2010
Вопрос:
У меня есть веб-приложение, в котором могут быть установлены дополнения. Для создания этих дополнений я создаю новое веб-приложение с той же структурой и ссылаюсь на сборку из основного приложения.
После этого я копирую файлы aspx (разметки) только в основное приложение, поэтому у меня есть страницы разметки и ссылка на сборку, чтобы я мог выполнять отладку.
Все это работало нормально вплоть до того момента, когда я вносил поправки, единственное, что изменилось с тех пор, как я работал над этим в последний раз, — это установка VS2010 SP1.
Теперь в коде есть точка — я не могу точно видеть, где это происходит, поскольку это внешний код, но идентификатор сеанса меняется, и я теряю все в сеансе.
У меня есть фрагмент кода для открытия нового окна с отчетом:
string link = String.Format( "window.open('{0}');", Page.ResolveUrl( "~/CustomPages/BudgetOnlineMedia.aspx" ) );
Page.ClientScript.RegisterStartupScript( this.GetType(), "MedReport", link, true );
после этого на базовой странице будет достигнута точка останова:
/// <summary>
/// OnPreload
/// </summary>
/// <param name="e">args</param>
[VersionChange( "7.3.88.272", "13/04/2011", "Fully qualified path to login page" )]
protected override void OnPreLoad( EventArgs e )
{
try
{
base.OnPreLoad( e );
if ( base.CurrentUser == null )
{
Response.Redirect( "~/Pages/Login.aspx", false );
}
}
catch ( Exception ex )
{
ErrorLogging.LogError( ex );
}
}
Снова возникает та же точка останова, но на этот раз изменился идентификатор сеанса!
На данный момент я могу прочитать callstack, но в моем коде нет ничего, что могло бы изменить сеанс.
Трассировка стека выглядит следующим образом:
> Web.WAP.Objects.DLL!Web.WAP.Objects.Controls.UserPresencePage.OnPreLoad(System.EventArgs e) Line 28 C#
System.Web.dll!System.Web.UI.Page.ProcessRequestMain(bool includeStagesBeforeAsyncPoint, bool includeStagesAfterAsyncPoint) 0x22b bytes
System.Web.dll!System.Web.UI.Page.ProcessRequest(bool includeStagesBeforeAsyncPoint, bool includeStagesAfterAsyncPoint) 0x84 bytes
System.Web.dll!System.Web.UI.Page.ProcessRequest() 0x51 bytes
System.Web.dll!System.Web.UI.Page.ProcessRequestWithNoAssert(System.Web.HttpContext context) 0x16 bytes
System.Web.dll!System.Web.UI.Page.ProcessRequest(System.Web.HttpContext context) 0x32 bytes
App_Web_-ti4sydr.dll!ASP.custompages_budgetexhibition_aspx.ProcessRequest(System.Web.HttpContext context) 0x33 bytes C#
System.Web.dll!System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 0xb6 bytes
System.Web.dll!System.Web.HttpApplication.ExecuteStep(System.Web.HttpApplication.IExecutionStep step, ref bool completedSynchronously) 0x4c bytes
System.Web.dll!System.Web.HttpApplication.ApplicationStepManager.ResumeSteps(System.Exception error) 0x133 bytes
System.Web.dll!System.Web.HttpApplication.System.Web.IHttpAsyncHandler.BeginProcessRequest(System.Web.HttpContext context, System.AsyncCallback cb, object extraData) 0x7c bytes
System.Web.dll!System.Web.HttpRuntime.ProcessRequestInternal(System.Web.HttpWorkerRequest wr) 0x17c bytes
System.Web.dll!System.Web.HttpRuntime.ProcessRequestNoDemand(System.Web.HttpWorkerRequest wr) 0x63 bytes
System.Web.dll!System.Web.HttpRuntime.ProcessRequest(System.Web.HttpWorkerRequest wr) 0x47 bytes
WebDev.WebHost20.dll!Microsoft.VisualStudio.WebHost.Request.Process() 0x177 bytes
WebDev.WebHost20.dll!Microsoft.VisualStudio.WebHost.Host.ProcessRequest(Microsoft.VisualStudio.WebHost.Connection conn) 0x6c bytes
[Appdomain Transition]
WebDev.WebHost20.dll!Microsoft.VisualStudio.WebHost.Server.OnSocketAccept(object acceptedSocket) 0xd3 bytes
mscorlib.dll!System.Threading._ThreadPoolWaitCallback.WaitCallback_Context(object state) 0x2f bytes
mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state) 0x6f bytes
mscorlib.dll!System.Threading._ThreadPoolWaitCallback.PerformWaitCallbackInternal(System.Threading._ThreadPoolWaitCallback tpWaitCallBack) 0x53 bytes
mscorlib.dll!System.Threading._ThreadPoolWaitCallback.PerformWaitCallback(object state) 0x59 bytes
Что такое [Переход домена приложения]?
Видите ли вы что-нибудь, что могло бы привести к изменению идентификатора сеанса!?
Редактировать:
хорошо, это может быть связано не с VS SP1, а с IE10 preview.
Теперь, когда я создаю окно.showModalDialog, затем из этого диалогового окна.откройте. Internet Explorer создает новый сеанс
Ответ №1:
хорошо, это может быть связано не с VS SP1, а с IE10 preview.
Теперь, когда я создаю окно.showModalDialog, затем из этого диалогового окна.откройте. Internet Explorer создает новый сеанс
Казалось, что это ошибка в IE8, но, похоже, она может вернуться в IE10.
Это обходной путь, который мне пришлось использовать.
на моей базовой странице для отображения модального диалога (который передает объект window)
/// <summary>
/// Shows a Page as a Modal dialog
/// </summary>
/// <param name="URL">The URL</param>
/// <param name="Width">The Width</param>
/// <param name="Height">The Height</param>
/// <param name="Resizable">Resizable?</param>
/// <param name="IfScript">Java script to run if the window returns true</param>
/// <param name="ElseScript">Java script to run if the window returns false</param>
protected void ShowModalDialog( string URL, int Width, int Height, bool Resizable, string IfScript, string ElseScript )
{
try
{
string sModalDialog = @"
try
{{
var args = new Object();
args.window = window;
if (window.showModalDialog('{0}', args, 'dialogHeight={1}px;dialogWidth={2}px;resizable={3}'))
{{
{4}
}}
else
{{
{5}
}}
}}
catch (e)
{{
alert(e.value);
}}";
string vbs = String.Format( sModalDialog, URL, Height, Width, Resizable ? "yes" : "no", IfScript, ElseScript );
base.ClientScript.RegisterStartupScript( this.GetType(), "ModalDialog", vbs, true );
}
catch ( Exception )
{
throw;
}
}
И метод базовой страницы для открытия всплывающего окна (который проверяет наличие переданного объекта window)
/// <summary>
/// Shows a Popup Window
/// </summary>
/// <param name="Link">The link to show in the window</param>
/// <param name="Width">The Width of the window</param>
/// <param name="Height">The Height of the window</param>
/// <param name="Name">The name of the window</param>
/// <param name="ScrollBars">The Scroll bars to show</param>
/// <param name="Resizable">Whether the window is resizable</param>
/// <param name="ShowToolBar">Whether to show the toolbar</param>
/// <param name="ShowStatusBar">Whether to show the status bar</param>
/// <param name="ShowAddressBar">Whether to show the address bar</param>
protected void OpenWindow( string Link, int Width, int Height, string Name, Sicon.API.Web.Enums.ScrollBars ScrollBars, bool Resizable, bool ShowToolBar, bool ShowStatusBar, bool ShowAddressBar )
{
try
{
StringBuilder sb = new StringBuilder();
sb.Append( "try" );
sb.Append( "{" );
sb.AppendFormat( "Link='{0}';", Link );
sb.AppendFormat( "Name='{0}';", Name.Replace( " ", "" ) );
sb.Append( " leftPos = 0;" );
sb.Append( " topPos = 0;" );
sb.Append( " if (screen) " );
sb.Append( " {" );
sb.AppendFormat( " leftPos = (screen.width / 2) - ( {0} / 2 );", Width );
sb.AppendFormat( " topPos = (screen.height / 2) - ( {0} / 2 );", Height );
sb.Append( " }" );
sb.Append( @"
var myWindow = window;
if ((typeof(dialogArguments) !== 'undefined' amp;amp; dialogArguments != null))
{
if (typeof(dialogArguments.window) !== 'undefined' amp;amp; dialogArguments.window != null)
{
myWindow = dialogArguments.window;
}
}
" );
sb.AppendFormat( " myWindow.open(Link,Name,'width={0},height={1},left=' leftPos ',top=' topPos ' ", Width, Height );
//Check whether to show Scroll Bars
switch ( ScrollBars )
{
case Sicon.API.Web.Enums.ScrollBars.One:
sb.Append( ",scrollbars=1 " );
break;
case Sicon.API.Web.Enums.ScrollBars.Two:
sb.Append( ",scrollbars=2 " );
break;
}
//Check whether the window is resizable
if ( Resizable )
{
sb.Append( ",resizable " );
}
//Check Whether to show the toolbar
if ( ShowToolBar )
{
sb.Append( ",toolbar " );
}
//Show the status bar
if ( ShowStatusBar )
{
sb.Append( ", status " );
}
//Show the address bar
if ( ShowAddressBar )
{
sb.Append( ", location " );
}
sb.Append( "');" );
sb.Append( "}" );
sb.Append( "catch (e)" );
sb.Append( "{" );
sb.Append( " alert(e.value);" );
sb.Append( "}" );
Page.ClientScript.RegisterStartupScript( this.GetType(), Name, sb.ToString(), true );
sb = null;
}
catch ( Exception )
{
throw;
}
}
Затем на странице, которая открывает второе окно (вызовите методы базовой страницы)
protected void btnBudgetOnlineMedia_Click( object sender, EventArgs e )
{
try
{
base.OpenWindow( Page.ResolveUrl( "~/CustomPages/BudgetOnlineMedia.aspx" ),
800,
600,
"Med Report",
API.Web.Enums.ScrollBars.Two,
true,
false,
false,
false );
}
catch ( Exception ex )
{
ErrorLogging.LogError( ex );
}
}
Примечание: я вызываю window.open в объекте window, который передается из диалоговых аргументов.
Это, конечно, ужасно, у кого-нибудь есть решение получше?
Информация об этой проблеме здесь:
http://support.microsoft.com/kb/831678
ОБНОВЛЕНИЕ: Это также может быть связано с установкой IE10, похоже, что некоторые из моих настроек безопасности в Интернете были сброшены, и это повлияло на javascript. Также полезно реализовать обходной путь в коде, чтобы избежать этого в будущем в любом случае.