HttpListener Проблема - PullRequest
       22

HttpListener Проблема

1 голос
/ 30 марта 2011

Я должен установить HttpListener, который будет ждать запросов от сервера нашего клиента. Я должен получить этот запрос на порт 8088 и извлечь строку запроса. Это легкая часть.

Я запускаю HttpListener в службе Windows. Я не могу заставить его правильно стрелять. Я строю проект установки, устанавливаю сервис на наш сервер и он никогда не запускается Я подозреваю, что есть ошибка с моим кодом.

HttpListenerClass:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Net;
using System.Threading;

namespace lalalolo
{
    class HttpListenerClass
    {
        bool keepAlive = true;

        public void AddToFile(string contents)
        {
            var fs = new FileStream(@"C:\HttpListenerserv.txt", FileMode.OpenOrCreate, FileAccess.Write);
            var sw = new StreamWriter(fs);
            sw.BaseStream.Seek(0, SeekOrigin.End);
            sw.WriteLine(contents);
            sw.Flush();
            sw.Close();
        }

        private HttpListener listener;

        public HttpListenerClass()
        {
            ThreadPool.SetMaxThreads(50, 100);
            ThreadPool.SetMinThreads(50, 50);
            listener = new HttpListener();
            listener.Prefixes.Add("http://*:8088/");
        }

        public void Start()
        {

            listener.Start();
            if(keepalive == true){
            {
                try
                {
                    HttpListenerContext ctx = listener.GetContext();
                    ThreadPool.QueueUserWorkItem(new WaitCallback(ProcessRequest), ctx);
                }
                catch(Exception ex)
                {
                    AddToFile(ex.Message);
                }
              }
            }
        }

        public void Stop()
        {
            listener.Stop();
            keepalive == false;
        }

        public void ProcessRequest(object listenerContext)
        {
            try
            {
                var context = (HttpListenerContext)listenerContext;
                string QS = context.Request.QueryString["ID"];
                AddToFile(QS);
            }

            catch(Exception ex)
            {
                AddToFile(ex.Message);
            }
        }
    }
}

Service1.cs:

using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Net;
using System.ServiceProcess;
using System.Text;
using System.Threading;

namespace lalalolo
{
    public partial class HttpListenerTest1 : ServiceBase
    {
        HttpListenerClass HTTP = new HttpListenerClass();

        public void AddToFile(string contents)
        {
            var fs = new FileStream(@"C:\HttpListenerserv.txt", FileMode.OpenOrCreate, FileAccess.Write);
            var sw = new StreamWriter(fs);
            sw.BaseStream.Seek(0, SeekOrigin.End);
            sw.WriteLine(contents);
            sw.Flush();
            sw.Close();
        }

        public HttpListenerTest1()
        {
            InitializeComponent();
        }

        protected override void OnStart(string[] args)
        {
            HTTP.Start();
        }

        protected override void OnStop()
        {
            HTTP.Stop();   
        }
    }
}

Что я делаю не так?

Спасибо, ребята!

1 Ответ

2 голосов
/ 30 марта 2011

Очередь рабочих элементов в цикле while(true)? Ты серьезно?!

  1. Ваш метод OnStart никогда не возвращается из-за этого цикла while. Тем не менее, для возврата к методу OnStart менеджер службы должен знать, что ваша служба запущена правильно.
  2. Ваш сервис, вероятно, просто умрет с OutOfMemoryException или чем-то подобным из-за этого бесконечного цикла.

Предложение:
Попробуйте принять этот образец . Это в IronPython, но также использует .NET Framework. Подсказка: while(true) в этой реализации следует изменить, чтобы можно было прерывать цикл while, когда ваша служба останавливается. Кроме того, вы должны вызвать serveforever в вашем Start методе асинхронным способом.
Это должно помочь вам.

...