2017-11-28 19 views
0

난 낸시와 함께 자기 호스팅을 만들었습니다. 그런 다음 앱을 서비스로 실행하고 싶습니다. 그래서 topshelf를 사용하여 빌드합니다. 그런 다음 프로그램을 디버깅하거나 .exe를 실행하면 프로그램이 제대로 실행됩니다. 그러나 서비스로 .exe를 설치하고 서비스를 시작할 때. nancy로 생성 한 API를 호출 할 수 없습니다 (브라우저에서 "localhost ..를 기다리는 중"오류 또는 성공을 반환하지 않음). 그것은 작업 디렉토리, 스레딩 또는 다른 것 때문입니까? 당신을 여기 Nancy는 Topshelf를 서비스로 실행할 때 작동하지 않습니까? 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(); 
    } 
} 

편집

이미 예외를 잡으려고 시도하지만 아무도 잡히지 않습니다. Dummy.m_autoreset.WaitOne() 및 Dummy.m_autoreset.Set()에 주석을 추가하려고합니다. 이제 API가 작동하지만 InitCDM() 내부의 함수가 실행되지 않습니까? 이 함수에서는 기계가 직접 또는 이벤트 핸들러에 의해 피드백을주는 기계보다 기계 용 라이브러리를 호출합니다. AddEventCDM() 스레드를 더 이상 사용할 수 없기 때문에 라이브러리에 의해 도달하지 못했습니다 eventhandler 만들 생각하십니까? 어떤 조언?

+0

처음 보는 것은 비어있는 catch 블록입니다. 예외를 잡아서 기록하십시오. 잠재적 인 오류 메시지를 의도적으로 버리면 어떤 일이 잘못되었는지 어떻게 알 수 있습니까? – nvoigt

+0

죄송합니다. 이제 이미 NancyModule 및 InitCDM() HostingCDM.cs에 예외를 추가합니다. 그러나 예외는 발생하지 않았습니다. –

답변

0

Start() 메서드의 새 스레드에서 NancyHost를 시작하십시오. 내 경우에는 Start() 메서드가 반환되지 않아 Windows 서비스로 시작할 수 없게되었습니다.

+0

이미 시작 했으므로 Start()에 대한 새 스레드를 만듭니다. –

+0

Windows 이벤트 뷰어에서 서비스의 오류를 확인 했습니까? –

+0

오류가 발견되지 않았습니다. 정보 서비스가 시작되고 중지됩니다. –