2017-11-28 3 views
0

Ich habe einige Self-Hosting mit Nancy erstellt, dann möchte ich die App als Dienste ausführen. Also benutze ich das Topshelf um es zu bauen. Dann, wenn ich mein Programm debuggen oder .exe ausführe, läuft Programm gut. Aber wenn ich .exe als Dienst installiere und den Dienst starte. Ich kann die API nicht aufrufen, die ich mit Nancy erstellt habe (im Browser nur "localhost warten ..." gibt keinen Fehler oder Erfolg zurück). Liegt es am Arbeitsverzeichnis, Threading oder irgendetwas anderem? dankeNancy mit Topshelf funktioniert nicht, wenn als Service ausgeführt wird? C#

Hier mein Code: Program.cs

public class Program 
{ 
    [STAThread] 
    public static void Main() 
    { 
     var thread = new Thread(WorkerMethod); 
     thread.SetApartmentState(ApartmentState.STA); 
     thread.IsBackground = false; 
     thread.Start(); 
    } 

    public static void WorkerMethod(object state) 
    { 
     HostFactory.Run(x => 
     { 
      x.Service<HostingAPI>(s => 
      { 
       s.ConstructUsing(name => new HostingAPI()); 
       s.WhenStarted(tc => tc.Start()); 
       s.WhenStopped(tc => tc.Stop()); 
      }); 

      x.RunAsLocalSystem(); 
      x.SetDescription("Hardware hosting API"); 
      x.SetDisplayName("Hosting Services for Hardware"); 
      x.SetServiceName("Hardware Services"); 
     }); 
    } 
} 

CDM_Module (das ab und bat ihn Modul)

public class CDM_Module : NancyModule 
{ 
    public CDM_Module() 
    { 
     try 
     { 
      Get["/CDM/Machine/Start"] = parameters => 
      { 
       var ins = HostingAPI.Instance; 
       bool result = ins.InitCDM_Thread(); 

       return Response.AsJson(result); 
      }; 

      Get["/CDM/Machine/OpenGate"] = parameters => 
      { 
       var ins = HostingAPI.Instance; 
       bool result = ins.StartProcess_Thread(); 

       return Response.AsJson(result); 
      }; 

      Get["/CDM/Machine/CloseGate"] = parameters => 
      { 
       var ins = HostingAPI.Instance; 
       bool result = ins.StopProcess_Thread(); 

       return Response.AsJson(result); 
      }; 
     } 
     catch 
     { 
     } 
    } 
} 

HostingAPI.cs (Start und Funktion und eine Funktion für API genannt stoppen)

public class HostingAPI 
{ 
    //global variable 
    private NancyHost mainHost; 
    public static HostingAPI Instance; 
    private string hostUrl; 
    //public static MainCDM Ins = new MainCDM(); 

    public clsCSDDPMControl ObjDPMControl = new clsCSDDPMControl(); 
    public ClsPrinterControl ObjPrinterControl = new ClsPrinterControl(); 

    //webservice 
    HttpClient httpClient = new HttpClient(); 

    public void Start() 
    { 
     //set hosturl dari document xml nantinya 
     //sementara default 
     //under construction 
     Config.ReadConfiguration(); 

     //set awal entity 
     buildEntity(); 

     AddEventCDM(); 
     AddEventPrinter(); 

     Instance = this; 

     if (hostUrl == null) hostUrl = "http://localhost:5030"; 

     mainHost = new NancyHost(new Uri(hostUrl)); 
     mainHost.Start(); 

     //Console.WriteLine("Hardware Hosting API is running on " + hostUrl); 

    } 

    public void Stop() 
    { 
     mainHost.Stop(); 
     //Console.WriteLine("Service stopped!"); 
    } 

    public bool InitCDM_Thread() 
    { 
     var thread = new Thread(InitCDM); 
     thread.SetApartmentState(ApartmentState.STA); 
     thread.IsBackground = false; 
     thread.Start(); 
     Dummy.m_autoreset.WaitOne(); 
     return rtn; 
    } 

    private void AddEventCDM() 
    { 
     ObjDPMControl.EvtBoxFullReceived += new clsCSDDPMControl.EvtBoxFullReceivedEventHandler(ObjDPMControl_EvtBoxFullReceived); 
     ObjDPMControl.EvtDocDataReceived += new clsCSDDPMControl.EvtDocDataReceivedEventHandler(ObjDPMControl_EvtDocDataReceived); 
     ObjDPMControl.EvtDocumentCounterReceived += new clsCSDDPMControl.EvtDocumentCounterReceivedEventHandler(ObjDPMControl_EvtDocumentCounterReceived); 
     ObjDPMControl.EvtDPMShellMsgReceived += new clsCSDDPMControl.EvtDPMShellMsgReceivedEventHandler(ObjDPMControl_EvtDPMShellMsgReceived); 
     ObjDPMControl.EvtErrMsgReceived += new clsCSDDPMControl.EvtErrMsgReceivedEventHandler(ObjDPMControl_EvtErrMsgReceived); 
     ObjDPMControl.EvtEventsReceived += new clsCSDDPMControl.EvtEventsReceivedEventHandler(ObjDPMControl_EvtEventsReceived); 
     ObjDPMControl.EvtImageStoredReceived += new clsCSDDPMControl.EvtImageStoredReceivedEventHandler(ObjDPMControl_EvtImageStoredReceived); 
     ObjDPMControl.EvtImageStoredErrorReceived += new clsCSDDPMControl.EvtImageStoredErrorReceivedEventHandler(ObjDPMControl_EvtImageStoredErrorReceived); 
     ObjDPMControl.EvtStatusReceived += new clsCSDDPMControl.EvtStatusReceivedEventHandler(ObjDPMControl_EvtStatusReceived); 
     ObjDPMControl.AxEvtBackTraceFileReady += new clsCSDDPMControl.AxEvtBackTraceFileReadyEventHandler(ObjDPMControl_AxEvtBackTraceFileReady); 
     ObjDPMControl.AxEvtComPortError += new clsCSDDPMControl.AxEvtComPortErrorEventHandler(ObjDPMControl_AxEvtComPortError); 
     ObjDPMControl.AxEvtExtraImageError += new clsCSDDPMControl.AxEvtExtraImageErrorEventHandler(ObjDPMControl_AxEvtExtraImageError); 
     ObjDPMControl.AxEvtFrontDitherReady += new clsCSDDPMControl.AxEvtFrontDitherReadyEventHandler(ObjDPMControl_AxEvtFrontDitherReady); 
     ObjDPMControl.AxEvtOutOfOrder += new clsCSDDPMControl.AxEvtOutOfOrderEventHandler(ObjDPMControl_AxEvtOutOfOrder); 
     ObjDPMControl.AxEvtRearDitherReady += new clsCSDDPMControl.AxEvtRearDitherReadyEventHandler(ObjDPMControl_AxEvtRearDitherReady); 

     DeviceReplyCode = Convert.ToInt32(ObjDPMControl.InitDevices(Config.DpmIniFile)); 

    } 

    private void InitCDM() 
    { 
     DeviceReplyCode = Convert.ToInt32(ObjDPMControl.InitDevices(Config.DpmIniFile)); 

     if (DeviceReplyCode == ObjDPMControl.CSDeviceSuccessCode) 
     { 
      if (ObjDPMControl.StartDPMEngine() == true) 
      { 
       if (ObjDPMControl.DPMSetTimeouts() == true) 
       { 
        rtn = true; 
       } 
       else 
       { 
        rtn = false; 
       } 
      } 
      else 
      { 
       rtn = false; 
      } 
     } 
     else 
     { 
      rtn = false; 
     } 

     Dummy.m_autoreset.Set(); 
    } 
} 

EDIT

Bereits versuchen, Ausnahme zu fangen, aber niemand gefangen. Ich versuche, Dummy.m_autoreset.WaitOne() und Dummy.m_autoreset.Set() zu kommentieren. Jetzt funktioniert die API, aber die Funktion in InitCDM() wird nicht ausgeführt? In dieser Funktion rufe ich eine Bibliothek für die Maschine als die Maschine zurück Feedback direkt oder durch Eventhandler. Ich denke, der Eventhandler, den ich mit AddEventCDM() erstelle, wird nicht von der Bibliothek erreicht, weil der Thread nicht mehr verfügbar ist? Irgendwelche Ratschläge?

+0

Das erste, was ich sehe, ist ein leerer Catch-Block. Ausnahmen abfangen und protokollieren Wie würden wir wissen, was schief gelaufen ist, wenn Sie die potenziellen Fehlermeldungen absichtlich wegwerfen? – nvoigt

+0

Entschuldigung. jetzt füge ich bereits eine Ausnahme für den Fehler in NancyModule und InitCDM() HostingCDM.cs hinzu. Aber keine Ausnahme wurde geworfen. –

Antwort

0

Versuchen Sie, die NancyHost für einen neuen Thread in der Start() -Methode zu starten. In meinem Fall kam die Methode Start() nicht zurück, wodurch es unmöglich wurde, als Windows-Dienst zu starten.

+0

Erstellen Sie bereits einen neuen Thread für Start(). –

+0

Haben Sie in der Windows-Ereignisanzeige nach Fehlern vom Dienst gesucht? –

+0

Kein Fehler, nur Informationsdienst starten und stoppen. –

Verwandte Themen