Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • World
  • Users
  • Groups
Skins
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Code Project
  1. Home
  2. General Programming
  3. C#
  4. Error stop Http Listener

Error stop Http Listener

Scheduled Pinned Locked Moved C#
helpquestioncsharpsysadmintutorial
33 Posts 5 Posters 0 Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • G George_George

    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?

    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;
            }
        }
    
    G Offline
    G Offline
    GDavy
    wrote on last edited by
    #3

    George_George wrote:

    while (true) { result = _Server.BeginGetContext(new AsyncCallback(this.HttpCallback), _Server); result.AsyncWaitHandle.WaitOne(); }

    In your StartListen you get in this endless loop. So after stopping the server the call to

    _Server.BeginGetContext(new AsyncCallback(this.HttpCallback), _Server);

    most likely throws this exception. You will need to check if the _Server object is still active before calling the BeginGetContext I guess...

    G S 2 Replies Last reply
    0
    • G GDavy

      George_George wrote:

      while (true) { result = _Server.BeginGetContext(new AsyncCallback(this.HttpCallback), _Server); result.AsyncWaitHandle.WaitOne(); }

      In your StartListen you get in this endless loop. So after stopping the server the call to

      _Server.BeginGetContext(new AsyncCallback(this.HttpCallback), _Server);

      most likely throws this exception. You will need to check if the _Server object is still active before calling the BeginGetContext I guess...

      G Offline
      G Offline
      George_George
      wrote on last edited by
      #4

      Thanks GDavy, How do check whether _Server is still active? Any suggestions? :-) regards, George

      G 1 Reply Last reply
      0
      • N N a v a n e e t h

        George_George wrote:

        _Server.Stop();

        I can't find where you are stopping the thread. You are just stopping the HTTPListener, not the thread. OnStop() method should be able to exit the thread also, I guess. Not sure this will be the reason for error.

        All C# applications should call Application.Quit(); in the beginning to avoid any .NET problems.- Unclyclopedia How to use google | Ask smart questions

        G Offline
        G Offline
        George_George
        wrote on last edited by
        #5

        Sorry N a v a n e e t h, My English is not very good. You mean I need to stop the thread tHttpThread in OnStop? regards, George

        N 1 Reply Last reply
        0
        • G George_George

          Sorry N a v a n e e t h, My English is not very good. You mean I need to stop the thread tHttpThread in OnStop? regards, George

          N Offline
          N Offline
          N a v a n e e t h
          wrote on last edited by
          #6

          George_George wrote:

          You mean I need to stop the thread tHttpThread in OnStop?

          Yes. The thread is not stopping in your code. Stop that on OnStop() method.

          All C# applications should call Application.Quit(); in the beginning to avoid any .NET problems.- Unclyclopedia How to use google | Ask smart questions

          G G 2 Replies Last reply
          0
          • N N a v a n e e t h

            George_George wrote:

            You mean I need to stop the thread tHttpThread in OnStop?

            Yes. The thread is not stopping in your code. Stop that on OnStop() method.

            All C# applications should call Application.Quit(); in the beginning to avoid any .NET problems.- Unclyclopedia How to use google | Ask smart questions

            G Offline
            G Offline
            George_George
            wrote on last edited by
            #7

            Thanks N a v a n e e t h, How to stop the thread gracefully? I think of using Abort, but we have discussed before this method call is not a good idea always. regards, George

            N 1 Reply Last reply
            0
            • G George_George

              Thanks GDavy, How do check whether _Server is still active? Any suggestions? :-) regards, George

              G Offline
              G Offline
              GDavy
              wrote on last edited by
              #8

              from MSDN on the BeginGetContext call[^] The InvalidOperationException is thrown when the server is stopped. So there you go it is normal behaviour. You can check the IsListening Property to see if the _Server is started or not.

              G 1 Reply Last reply
              0
              • N N a v a n e e t h

                George_George wrote:

                You mean I need to stop the thread tHttpThread in OnStop?

                Yes. The thread is not stopping in your code. Stop that on OnStop() method.

                All C# applications should call Application.Quit(); in the beginning to avoid any .NET problems.- Unclyclopedia How to use google | Ask smart questions

                G Offline
                G Offline
                GDavy
                wrote on last edited by
                #9

                Actually because the BeginGetContext call will throw an exception when the _Server object is stopped, the thread will stop too so no extra work is actually required.

                N 1 Reply Last reply
                0
                • G George_George

                  Thanks N a v a n e e t h, How to stop the thread gracefully? I think of using Abort, but we have discussed before this method call is not a good idea always. regards, George

                  N Offline
                  N Offline
                  N a v a n e e t h
                  wrote on last edited by
                  #10

                  Go with this[^]. It will work.

                  All C# applications should call Application.Quit(); in the beginning to avoid any .NET problems.- Unclyclopedia How to use google | Ask smart questions

                  1 Reply Last reply
                  0
                  • G GDavy

                    Actually because the BeginGetContext call will throw an exception when the _Server object is stopped, the thread will stop too so no extra work is actually required.

                    N Offline
                    N Offline
                    N a v a n e e t h
                    wrote on last edited by
                    #11

                    I mean the thread which he created.

                    All C# applications should call Application.Quit(); in the beginning to avoid any .NET problems.- Unclyclopedia How to use google | Ask smart questions

                    G 1 Reply Last reply
                    0
                    • N N a v a n e e t h

                      I mean the thread which he created.

                      All C# applications should call Application.Quit(); in the beginning to avoid any .NET problems.- Unclyclopedia How to use google | Ask smart questions

                      G Offline
                      G Offline
                      GDavy
                      wrote on last edited by
                      #12

                      ;) I know which thread you mean. The thread he creates uses the StartListening Function. In that function the BeginGetContext call is made, and this will throw the InvalidOperationException when the _Server object is stopped. So the thread he creates really does exit when the _Server stops. He will just need to catch the InvalidOperationException and evaluate that it is expected behaviour.

                      G N 2 Replies Last reply
                      0
                      • G GDavy

                        from MSDN on the BeginGetContext call[^] The InvalidOperationException is thrown when the server is stopped. So there you go it is normal behaviour. You can check the IsListening Property to see if the _Server is started or not.

                        G Offline
                        G Offline
                        George_George
                        wrote on last edited by
                        #13

                        Thanks GDavy, Your solution works. Cool! regards, George

                        1 Reply Last reply
                        0
                        • G GDavy

                          ;) I know which thread you mean. The thread he creates uses the StartListening Function. In that function the BeginGetContext call is made, and this will throw the InvalidOperationException when the _Server object is stopped. So the thread he creates really does exit when the _Server stops. He will just need to catch the InvalidOperationException and evaluate that it is expected behaviour.

                          G Offline
                          G Offline
                          George_George
                          wrote on last edited by
                          #14

                          Thanks GDavy! If I fixed in this way, are there any need to stop the tHttpThread thread?

                                      while (true)
                                      {
                                          if (\_Server.IsListening)
                                          {
                                              result = \_Server.BeginGetContext(new AsyncCallback(this.HttpCallback), \_server);
                                              result.AsyncWaitHandle.WaitOne();
                                          }
                                          else
                                          {
                                              break;
                                          }
                                      }
                          

                          regards, George

                          1 Reply Last reply
                          0
                          • G GDavy

                            ;) I know which thread you mean. The thread he creates uses the StartListening Function. In that function the BeginGetContext call is made, and this will throw the InvalidOperationException when the _Server object is stopped. So the thread he creates really does exit when the _Server stops. He will just need to catch the InvalidOperationException and evaluate that it is expected behaviour.

                            N Offline
                            N Offline
                            N a v a n e e t h
                            wrote on last edited by
                            #15

                            GDavy wrote:

                            In that function the BeginGetContext call is made, and this will throw the InvalidOperationException when the _Server object is stopped. So the thread he creates really does exit when the _Server stops. He will just need to catch the InvalidOperationException

                            I know. I was suggesting him to stop that thread when HTTPListener stops, so it won't call again BeginGetContext(). Will that be a good method than catching exception, and thread getting aborted automatically ?

                            All C# applications should call Application.Quit(); in the beginning to avoid any .NET problems.- Unclyclopedia How to use google | Ask smart questions

                            G 1 Reply Last reply
                            0
                            • G George_George

                              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?

                              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;
                                      }
                                  }
                              
                              Z Offline
                              Z Offline
                              Zoltan Balazs
                              wrote on last edited by
                              #16

                              George_George wrote:

                              catch (Exception ex) { throw ex; }

                              You're not doing anything with the exception and then you throw a modified exception (without the original stack trace). If you want to re-throw the original exception use

                              throw;

                              Simple.

                              Work @ Network integrated solutions | Flickr | A practical use of the MVC pattern

                              G 1 Reply Last reply
                              0
                              • Z Zoltan Balazs

                                George_George wrote:

                                catch (Exception ex) { throw ex; }

                                You're not doing anything with the exception and then you throw a modified exception (without the original stack trace). If you want to re-throw the original exception use

                                throw;

                                Simple.

                                Work @ Network integrated solutions | Flickr | A practical use of the MVC pattern

                                G Offline
                                G Offline
                                George_George
                                wrote on last edited by
                                #17

                                Thanks Zoltan, Good to learn from you. Any comments to? http://www.codeproject.com/script/Forums/View.aspx?fid=1649&msg=2580309[^] regards, George

                                1 Reply Last reply
                                0
                                • N N a v a n e e t h

                                  GDavy wrote:

                                  In that function the BeginGetContext call is made, and this will throw the InvalidOperationException when the _Server object is stopped. So the thread he creates really does exit when the _Server stops. He will just need to catch the InvalidOperationException

                                  I know. I was suggesting him to stop that thread when HTTPListener stops, so it won't call again BeginGetContext(). Will that be a good method than catching exception, and thread getting aborted automatically ?

                                  All C# applications should call Application.Quit(); in the beginning to avoid any .NET problems.- Unclyclopedia How to use google | Ask smart questions

                                  G Offline
                                  G Offline
                                  George_George
                                  wrote on last edited by
                                  #18

                                  Thanks N a v a n e e t h, 1. Sounds good. Could you show the code please? I want to learn from you but feel do not know how to code. :-) 2. Any comments to? http://www.codeproject.com/script/Forums/View.aspx?fid=1649&msg=2580309[^] regards, George

                                  N 1 Reply Last reply
                                  0
                                  • G George_George

                                    Thanks N a v a n e e t h, 1. Sounds good. Could you show the code please? I want to learn from you but feel do not know how to code. :-) 2. Any comments to? http://www.codeproject.com/script/Forums/View.aspx?fid=1649&msg=2580309[^] regards, George

                                    N Offline
                                    N Offline
                                    N a v a n e e t h
                                    wrote on last edited by
                                    #19

                                    1 -

                                    volatile bool continue = true;
                                    public void StartListen()
                                    {
                                    try
                                    {
                                    IAsyncResult result;
                                    _Server.Prefixes.Add(String.Format("http://+:{0}/", 9099));
                                    _Server.Start();
                                    while (continue)
                                    {
                                    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)
                                        {
                                            **continue = false;**
                                            \_Server.Stop();
                                        }
                                    

                                    2 - It looks fine.

                                    All C# applications should call Application.Quit(); in the beginning to avoid any .NET problems.- Unclyclopedia How to use google | Ask smart questions

                                    G 1 Reply Last reply
                                    0
                                    • N N a v a n e e t h

                                      1 -

                                      volatile bool continue = true;
                                      public void StartListen()
                                      {
                                      try
                                      {
                                      IAsyncResult result;
                                      _Server.Prefixes.Add(String.Format("http://+:{0}/", 9099));
                                      _Server.Start();
                                      while (continue)
                                      {
                                      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)
                                          {
                                              **continue = false;**
                                              \_Server.Stop();
                                          }
                                      

                                      2 - It looks fine.

                                      All C# applications should call Application.Quit(); in the beginning to avoid any .NET problems.- Unclyclopedia How to use google | Ask smart questions

                                      G Offline
                                      G Offline
                                      George_George
                                      wrote on last edited by
                                      #20

                                      Thanks N a v a n e e t h, I think your code has an issue when we are executing result = _Server.BeginGetContext(new AsyncCallback(this.HttpCallback), _Server) while at the same time, Stop is called. :-) In this situation, there is no chance to check continue status variable. Any comments? regards, George

                                      N 2 Replies Last reply
                                      0
                                      • G George_George

                                        Thanks N a v a n e e t h, I think your code has an issue when we are executing result = _Server.BeginGetContext(new AsyncCallback(this.HttpCallback), _Server) while at the same time, Stop is called. :-) In this situation, there is no chance to check continue status variable. Any comments? regards, George

                                        N Offline
                                        N Offline
                                        N a v a n e e t h
                                        wrote on last edited by
                                        #21

                                        Yes you are correct. I wrote it to explain the things, and don't consider it as a final code. Try with some synchronization mechanism, or the other method which GDavy suggested, it's looking good.

                                        All C# applications should call Application.Quit(); in the beginning to avoid any .NET problems.- Unclyclopedia How to use google | Ask smart questions

                                        G 1 Reply Last reply
                                        0
                                        • N N a v a n e e t h

                                          Yes you are correct. I wrote it to explain the things, and don't consider it as a final code. Try with some synchronization mechanism, or the other method which GDavy suggested, it's looking good.

                                          All C# applications should call Application.Quit(); in the beginning to avoid any .NET problems.- Unclyclopedia How to use google | Ask smart questions

                                          G Offline
                                          G Offline
                                          George_George
                                          wrote on last edited by
                                          #22

                                          Thanks N a v a n e e t h, Using synchronization in service stop callback method OnStop is dangerous, right? :-) If I do not understand your points correctly, please feel free to correct me and post your code. regards, George

                                          1 Reply Last reply
                                          0
                                          Reply
                                          • Reply as topic
                                          Log in to reply
                                          • Oldest to Newest
                                          • Newest to Oldest
                                          • Most Votes


                                          • Login

                                          • Don't have an account? Register

                                          • Login or register to search.
                                          • First post
                                            Last post
                                          0
                                          • Categories
                                          • Recent
                                          • Tags
                                          • Popular
                                          • World
                                          • Users
                                          • Groups