Не удается прочитать из закрытого исключения TextReader в приложении asp.net
Я использую приложение ASP 4.5. На одной из страниц пользователь должен ответить на несколько вопросов и нажать кнопку, чтобы завершить тест. Мое приложение использует текстовый файл для анализа ответов пользователей. Если пользователь все делает быстро, приложение работает нормально, но когда ему требуется больше 20 минут, чтобы закончить тест, я получаю исключение
Не удается прочитать из закрытого TextReader
Я не понимаю, в чем дело, потому что я открываю StreamReader только при нажатии кнопки. Это часть моего кода:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
GlobalVariables.surname = Request.QueryString["surname"];
GlobalVariables.name = Request.QueryString["name"];
GlobalVariables.gender = Request.QueryString["gender"];
GlobalVariables.age = int.Parse(Request.QueryString["age"]);
}
Label1.Width = 700;
Button1.Click += new EventHandler(this.Button1_Click);
}
void Button1_Click(Object sender, EventArgs e)
{
var f0= new FileStream(Server.MapPath("./key.txt"), FileMode.Open, FileAccess.Read);
StreamReader sr = new StreamReader(f0);
//.....
sr.Close();
sr.Dispose();
}
Может ли кто-нибудь помочь мне, пожалуйста?
3 ответа
когда ему требуется больше 20 секунд, чтобы закончить тест, я получаю исключение
Это звучит так, как будто их сессия истекла. Чтобы это исправить, я рекомендую добавить JavaScript, чтобы установить пульс на веб-сервере. Сердцебиение будет поддерживать сессию; ему не нужно ничего делать, кроме как делать запрос каждую минуту или около того, чтобы сервер знал, что вы все еще там.
В дополнение к ответу от Джоэла я бы рекомендовал отделить обработку файла от чтения файла.
List<string> lines = new List<string>();
using (var f0 = new FileStream(Server.MapPath("./key.txt"), FileMode.Open, FileAccess.Read))
{
string line;
using (StreamReader reader = new StreamReader(f0))
{
while ((line = reader.ReadLine()) != null)
{
lines.add(line);
}
}
}
// it would need to be a very big text file to be a memory issue
// do your processing here
Если страница не является отправкой назад, вам нужно настроить страницу так, как ее следует просматривать в первый раз. Я бы также предложил перемещать нажатие кнопки даже в пределах if(!Page.IsPostBack), а также все, что нужно настроить перед постбэк. Переместите ваш потоковый ридер в else... как-то так, если (!Page.IsPostBack) else { stream reader stuff } и уберите нажатие кнопки даже в общем, так как кнопка вызывает обратную передачу.
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
GlobalVariables.surname = Request.QueryString["surname"];
GlobalVariables.name = Request.QueryString["name"];
GlobalVariables.gender = Request.QueryString["gender"];
GlobalVariables.age = int.Parse(Request.QueryString["age"]);
Label1.Width = 700;
}
else
{
DoPostBackStuff();
}
}
private void DoPostBackStuff()
{
var f0= new FileStream(Server.MapPath("./key.txt"), FileMode.Open, FileAccess.Read);
StreamReader sr = new StreamReader(f0);
//.....
sr.Close();
sr.Dispose();
}