Member 12637386 Ответов: 2

Vb.net -использование переменных сеанса, установленных для объектов


Всем привет,

Я пытаюсь установить и получить переменные сеанса. На самом деле это memorystream и stream writer.

Я установил их в global.aspx таким образом -

Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)
    Dim memoryStream As New System.IO.MemoryStream()
    Dim textWriter As System.IO.TextWriter = New System.IO.StreamWriter(memoryStream)
    Dim bytesInStream As Byte()
End Sub


это, кажется, работает. Во всяком случае, никаких ошибок.

Что я уже пробовал:

В функции in a на странице aspx.vb я вызываю эти переменные сеанса -

Сессия ("textWriter").WriteLine ("тест")

Никаких ошибок при предварительном просмотре, но когда я запускаю его, он выдает исключение - "объектная переменная или с блочной переменной не задана."

Это не в цикле или с блоком, так что я думаю, что он не видит переменную сеанса ???? Но только когда вы запускаете код? Как я уже сказал, это не проявляется как ошибка в самом коде.

Действительно застрял, есть идеи? Или, если уж на то пошло, как я мог бы установить эти объекты один раз даже на другой .aspx page_load sub и иметь возможность видеть их в функции на другой странице .aspx?

Я не могу установить их на странице, на которой находится функция, потому что страница aspx.vb загружается много раз, когда клиент AJAX вызывает ее, и она должна продолжать добавляться к потоку памяти.

jkirkerx

WriteLine? Куда писать-то? чтобы написать строку на веб-странице, текст должен быть в ответном выводе HTML like Response.письменный текст")

Что вы пытаетесь сохранить, как образ?

Member 12637386

Writeline записывает текст в поток памяти, который я позже загружу в виде текстового файла. См. код выше в блоке application_start (который на самом деле должен быть session_start)

Dim memoryStream как новый System. IO. MemoryStream()
Дим textwriter в качестве системы.ИО.Textwriter В = Новой Системы.ИО.Модулю записи StreamWriter(потоке MemoryStream)

jkirkerx

Да, но сеанс-это объект, которым управляет веб-сервер, и это просто строка или примитивный объект. Asp.net предоставляет доступ к сеансу на веб-сервере под названием Session.

Возможно,Вам удастся сохранить строку байтов base64 в сеансе. Создайте массив байтов и преобразуйте его в строку base64 и наоборот.

2 Ответов

Рейтинг:
15

Richard Deeming

Вы создали три локальные переменные в Application_Start метод, но вы их нигде не хранили. Вы, конечно,не добавили их к сеансу.

Чтобы сохранить переменную в сеансе, вам нужно добавить ее в сеанс. Для этого вам нужно будет использовать Session_OnStart событие:

Sub Session_OnStart(ByVal sender As Object, ByVal e As EventArgs)
    Dim memoryStream As New System.IO.MemoryStream()
    HttpContext.Current.Session.Add("memoryStream", memoryStream)
    
    Dim textWriter As New System.IO.StreamWriter(memoryStream)
    HttpContext.Current.Session.Add("textWriter", textWriter)
End Sub

Вы не можете использовать Application_Start, потому что это срабатывает только один раз, когда ваше приложение запускается. То Session_OnStart событие[^] срабатывает при создании нового сеанса, что будет происходить несколько раз во время работы вашего приложения, когда к нему подключаются разные пользователи.

ASP.NET обзор жизненного цикла приложения[^]


Member 12637386

Ричард,

Я добавил -

Вложенные события session_onstart(как byval отправителя как объект, как byval E Как EventArgs в)
Dim memoryStream как новый System. IO. MemoryStream()
Свойство HttpContext.Тока.Сессия.Добавить ("memoryStream", memoryStream)

Dim textWriter как новый System. IO. TextWriter(memoryStream)
Свойство HttpContext.Тока.Сессия.Добавить ("textWriter", textWriter)
Конец Подводной Лодки

New System. IO. TextWriter (memoryStream) показывает ошибку - ' New не может быть объявлен в классе, который объявлен MustInherit

Однако, похоже, что сеанс ("memoryStream") доступен во всем сеансе. Спасибо

Richard Deeming

Извините, так и должно быть StreamWriter, нет TextWriter- Я обновил ответ.

Member 12637386

Ах. Понял. спасибо снова

Member 12637386

И если я удалю "Новый", то ошибка теперь будет в memoryStream в строке -
Дим textwriter в качестве системы.ИО.Textwriter в(потоке MemoryStream)

Ошибка чтения-границы массива не могут отображаться в разделителях типов.

Member 12637386

Я понял. Я изменил его на -
Дим textwriter в качестве системы.ИО.Textwriter В = Новой Системы.ИО.Модулю записи StreamWriter(потоке MemoryStream)

Я приму твой ответ, Ричард. это очень помогло. Спасибо

jkirkerx

Я не знал, что существует событие Session_OnStart.
К тому же я думал, что только примитивы могут храниться в сеансе.
Молодец, Ричард!

Richard Deeming

Если вы используете один из режимов состояния сеанса вне процесса, то типы, которые вы храните, должны быть сериализуемыми. Но для режима in-process по умолчанию вы можете хранить (почти) любой тип в сеансе.

jkirkerx

Спасибо, Ричард!
Скажем, у меня есть вопрос или просто любопытно узнать о формуле, над которой я работаю, и я хотел бы запустить ее, чтобы развлечь вас вопросом или формулой, не могли бы вы написать мне? если нет то это круто

Richard Deeming

Не лучше ли написать об этом как о вопросе? Таким образом, другие люди тоже могут помочь. :)

jkirkerx

Хорошо

Рейтинг:
1

jkirkerx

В Global.asax я знаю, что вы можете установить свойство, например, когда вы щелкаете правой кнопкой мыши проект, а затем переходите на вкладку ресурс, в которой вы можете установить строковый ресурс. Но это не объект сеанса. Это объект отражения.

Я также знаю, что вы можете писать на ресурс или создавать новые, но мой VS2015 в данный момент неисправен, и я не могу показать пример этого.


protected void Application_Start()
{
     AreaRegistration.RegisterAllAreas();
     FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
     RouteConfig.RegisterRoutes(RouteTable.Routes);                     
}

public static string GetWebsiteName()
{
    string pValue = Properties.Settings.Default.WebsiteName;
    return pValue;
}


Чтобы получить доступ к строке, MvcApplication - это класс проекта, не знаю, каким будет ваш.
string websiteName = MvcApplication.GetWebsiteName();