Сеансы Asp.net, если вы используете встроенных провайдеров, случайно не дадут вам чужой сеанс. SomeProprietarySessionManagementLookup()
является вероятным виновником и возвращает плохие значения или просто не работает.
Session["UserID"] = SomeProprietarySessionManagementLookup();
Прежде всего, присвоение возвращаемого значения из асинхронно SomePprietarySessionManagementLookup () просто не будет работать. Код консультанта, вероятно, выглядит так:
public void SomeProprietarySessionManagementLookup()
{
// do some async lookup
Action<object> d = delegate(object val)
{
LookupSession(); // long running thing that looks up the user.
Session["UserID"] = 1234; // Setting session manually
};
d.BeginInvoke(null,null,null);
}
Консультант не полностью владеет BS, но они написали некоторый глючный код. Response.Redirect () генерирует ThreadAbort, и если проприетарный метод является асинхронным, asp.net не знает, ждать для асинхронного метода, чтобы записать обратно в сеанс, прежде чем сам asp.net сохранит сессия. Вероятно, поэтому иногда это работает, а иногда нет.
Их код может работать, если сеанс asp.net находится в процессе, но сервер состояний или сервер баз данных не будут. Это зависит от времени.
Я проверял следующее. Мы используем государственный сервер в разработке. Этот код работает, поскольку сеанс записывается до завершения основного потока.
Action<object> d = delegate(object val)
{
System.Threading.Thread.Sleep(1000); // waits a little
Session["rubbish"] = DateTime.Now;
};
d.BeginInvoke(null, null, null);
System.Threading.Thread.Sleep(5000); // waits a lot
object stuff = Session["rubbish"];
if( stuff == null ) stuff = "not there";
divStuff.InnerHtml = Convert.ToString(stuff);
Этот следующий фрагмент кода не работает , поскольку сеанс уже был сохранен обратно на сервер состояний к тому времени, когда асинхронный метод доходит до установки значения сеанса.
Action<object> d = delegate(object val)
{
System.Threading.Thread.Sleep(5000); // waits a lot
Session["rubbish"] = DateTime.Now;
};
d.BeginInvoke(null, null, null);
// wait removed - ends immediately.
object stuff = Session["rubbish"];
if( stuff == null ) stuff = "not there";
divStuff.InnerHtml = Convert.ToString(stuff);
Первый шаг для консультанта - сделать свой код синхронным, потому что его трюк производительности не сработал вообще. Если это исправит, попросите консультанта правильно реализовать, используя Шаблон проектирования асинхронного программирования