none
проблемы с HttpListener RRS feed

  • Вопрос

  • Здравствуйте. 
    У меня есть слушатель http запросов, которого создаю при старте приложения
    HttpListener _listener = new HttpListener();
    _listener.Prefixes.Add(ConfReader.GetParamValue("s­erverAddress"));
    _listener.IgnoreWriteExceptions = true;
    _listener.Start();
    new Thread(Listen).Start();

    Далее метод Listen

    void Listen()
    {
    while (true)
    {
    try
    {
    HttpListenerContext httpContext = _listener.GetContext();

    string reqStr = string.Empty;

    using (Stream inStream = httpContext.Request.InputStream)
    {
    using (StreamReader sr = new StreamReader(inStream))
    {
    if (inStream.CanRead)
    reqStr = sr.ReadLine();
    }
    }

    using (Stream outStream = httpContext.Response.OutputStream)
    {
    using (StreamWriter sw = new StreamWriter(outStream))
    {
    // todo:
    sw.Flush();
    }
    }
    }
    catch (Exception ex)
    {
    Logger.AddLog(ex.Message + "\r\n" + ex.StackTrace);
    }
    }
    }

    И клиентское приложение, которое посылает запрос каждую минуту.

    void TimerHandler(object sender, System.Timers.ElapsedEventArgs e)
    {

    var myRequest = (HttpWebRequest)WebRequest.Create(_serverAddress);
    myRequest.Method = "POST";
    myRequest.ContentType = "application/x-www-form-urlencoded";

    using (var reqStream = myRequest.GetRequestStream())
    {
    using (var reqSW = new StreamWriter(reqStream))
    {
    reqSW.Write("OK");
    reqSW.Flush();
    }
    }

    var resp = (HttpWebResponse)myRequest.GetResponse();

    using (var respStream = resp.GetResponseStream())
    {
    using (var respSr = new StreamReader(respStream))
    {
    string s = respSr.ReadLine();
    //todo
    }
    }
    }
    catch(Exception ex)
    {
    Logger.AddLog(ex.Message + "\r\n" + ex.StackTrace);
    }
    }

    Все работает нормально, но когда смотрю логи на стороне сервера, замечаю что за день бывает, что несколько раз 
    вылетает ошибка. The I/O operation has been aborted because of either a thread exit or an application request

    Вот из-за чего эта ошибка и тем более как от нее избавиться я никак не пойму. Если у кого нибудь есть предположения,
    то был бы благодарен за помощь.
    28 апреля 2011 г. 11:23

Ответы

  • Все операции ввода/вывода (I/O) инициированные некоторым потоком отменяются, если этот поток прекращается (о чем и говорится в сообщении об ошибке). Для перекрывающихся сокетов незаконченные асинхронные операции могут завершиться неудачно, если поток закроется до того как операции выполнятся. Попробуйте вызывать функцию Listen в таком потоке из пула потоков, который будет существовать на протяжении всего процесса.
    • Предложено в качестве ответа Abbas Gussenov 28 апреля 2011 г. 21:05
    • Помечено в качестве ответа Abolmasov DmitryModerator 3 мая 2011 г. 5:01
    28 апреля 2011 г. 14:48

Все ответы

  • Забыл сказать что ошибка вылетает на строчке reqStr = sr.ReadLine(). И случается такое всего пару раз в день
    28 апреля 2011 г. 11:44
  • Все операции ввода/вывода (I/O) инициированные некоторым потоком отменяются, если этот поток прекращается (о чем и говорится в сообщении об ошибке). Для перекрывающихся сокетов незаконченные асинхронные операции могут завершиться неудачно, если поток закроется до того как операции выполнятся. Попробуйте вызывать функцию Listen в таком потоке из пула потоков, который будет существовать на протяжении всего процесса.
    • Предложено в качестве ответа Abbas Gussenov 28 апреля 2011 г. 21:05
    • Помечено в качестве ответа Abolmasov DmitryModerator 3 мая 2011 г. 5:01
    28 апреля 2011 г. 14:48