Hello everyone,
Here is my simple application code for a Windows Service application. The question is, when stop the service, there is always,
// [System.InvalidOperationException] = {"Please call the Start() method before calling this method."}
Does anyone have any ideas why there is such issue and how to fix?
[Code]
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.ServiceProcess;
using System.Text;
using System.Net;
using System.Threading;
namespace TestServiceStop1
{
public partial class Service1 : ServiceBase
{
private Thread _tHttpThread;
private TestHttpServer _server;
public Service1()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
_server = new TestHttpServer(this);
_tHttpThread = new Thread(_server.StartListen);
_tHttpThread.Start();
}
protected override void OnStop()
{
// stop HTTP server
_server.Stop(false);
}
}
public class TestHttpServer
{
// listening HTTP port
private int _Port = 0;
// internal wrapped HTTP listener
private HttpListener _Server = new HttpListener();
private Service1 _manager;
public TestHttpServer (Service1 manager)
{
_manager = manager;
}
public int ListenPort
{
get
{
return _Port;
}
set
{
_Port = value;
}
}
public void StartListen()
{
try
{
IAsyncResult result;
_Server.Prefixes.Add(String.Format("http://+:{0}/", 9099));
_Server.Start();
while (true)
{
result = _Server.BeginGetContext(new AsyncCallback(this.HttpCallback), _Server);
result.AsyncWaitHandle.WaitOne();
}
}
// any exceptions are not expected
// catch InvalidOperationException during service stop
// [System.InvalidOperationException] = {"Please call the Start() method before calling this method."}
catch (Exception ex)
{
throw ex;
}
}
public void Stop(bool isTerminate)
{
_Server.Stop();
}
// callback function when there is HTTP request received
private void HttpCallback(IAsyncResult result)
{
HttpListenerContext context = _Server.EndGetContext(result);
HandleRequest(context);
}
// find matched URL HTTP request handler and invoke related handler
private void HandleRequest(HttpListenerContext context)
{
string matchUrl = context.Request.Url.AbsolutePath.Trim().ToLower();
context.Response.StatusCode = 200;
context.Response.StatusDescription = "OK";
context.Response.Close();
}
} // end of Http Listener class
}
[/Code]
thanks in advance,
George