开发者

HttpListener Problem

I have to establish an HttpListener that will wait for requests made by our client's server. I have to receive that request on port 8088 and extract the query string. That is the easy part.

I'm running the HttpListener in a windows service. I cannot get it to fire properly. I bui开发者_开发知识库ld the setup project install the service on our server and it never starts. I suspect there's an error with my code.

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();   
        }
    }
}

What am I doing wrong?

Thank you guys!


Queuing worker items in a while(true) loop? Are you serious?!

  1. Your OnStart method never returns because of that while loop. However, returning from the OnStart method is essential for the service manager to know, that your service started correctly.
  2. Your service will probably just die with an OutOfMemoryException or something similar, because of that endless loop.

Suggestion:
Try adopting this sample. It is in IronPython but that also uses the .NET framework. Hint: The while(true) in that implementation should be changed to be able to break the while loop when your service is being stopped. Additionally, you must call serveforever in your Start method in an async way.
This should get you going.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜