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 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
                                        • 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
                                          #23

                                          George_George wrote:

                                          result = _Server.BeginGetContext(new AsyncCallback(this.HttpCallback), _Server) while at the same time, Stop is called. [Smile]

                                          George - I was trying to solve the quoted issue. When I looked into your code carefully, I am confused. Your HTTPServer can connect only one client at a time ?

                                          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
                                          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