2017-11-28 4 views
0

私はナンシーと自己ホスティングをいくつか作りましたが、私はアプリケーションをサービスとして実行します。だから私はそれを構築するためにトップシェルフを使用します。その後、私のプログラムをデバッグするか、.exeを実行すると、プログラムは正常に動作しています。しかし、私はサービスとして.exeをインストールし、サービスを開始します。私はnancyで作成したAPIを呼び出すことはできません(ブラウザーでは "localhost ..を待っています"エラーや成功を返さない)。それは作業ディレクトリ、スレッドまたは何か他のものなのでしょうか?ここでナンシーとトップシェルフがサービスとして実行されても機能しませんか? C#

が私のコードでありがとう: 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(ナンシー・モジュールは)

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(機能とAPIのために呼ばれる一つの機能を起動および停止します)

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

すでに例外をキャッチしようとしましたが、誰もキャッチしません。 私はDummy.m_autoreset.WaitOne()とDummy.m_autoreset.Set()についてコメントしようとします。今APIが動作しますが、InitCDM()内の関数は実行されません。その関数では、マシンが直接フィードバックを返すか、イベントハンドラによって返されるライブラリよりも、いくつかのライブラリを呼び出します。 AddEventCDM()でイベントハンドラを作成すると、スレッドがもう利用できないため、ライブラリからアクセスできないと思いますか?アドバイスはありますか?

+0

最初に私が見るのは、空のキャッチブロックです。例外をキャッチしてログに記録する潜在的なエラーメッセージを意図的に破棄したときに、何が問題になったのか、どのようにしてわかりますか? – nvoigt

+0

申し訳ありません。今はすでにNancyModuleとInitCDM()HostingCDM.csに例外を追加しています。しかし、例外はスローされていません。 –

答えて

0

Start()メソッドの新しいスレッドでNancyHostを開始しようとします。私の場合、Start()メソッドは返されず、Windowsサービスとして開始することが不可能になりました。

+0

すでにStart()に新しいスレッドを作成しています。 –

+0

Windowsイベントビューアでサービスからのエラーをチェックしましたか? –

+0

エラーは検出されず、情報サービスの開始と停止のみが行われます。 –

関連する問題