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.
  • 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 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
              #10

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

                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
                • 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
                                        • N N a v a n e e t h

                                          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 Offline
                                          G Offline
                                          George_George
                                          wrote on last edited by
                                          #24

                                          Thanks N a v a n e e t h, 1. I have checked multiple clients can enter HandleRequest when we call EndGetContext. Please feel free to correct me if I am wrong. 2. If you have any ideas to improve my code to handle clients' request more efficiently? regards, George

                                          N 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