私はナンシーと自己ホスティングをいくつか作りましたが、私はアプリケーションをサービスとして実行します。だから私はそれを構築するためにトップシェルフを使用します。その後、私のプログラムをデバッグするか、.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()でイベントハンドラを作成すると、スレッドがもう利用できないため、ライブラリからアクセスできないと思いますか?アドバイスはありますか?
最初に私が見るのは、空のキャッチブロックです。例外をキャッチしてログに記録する潜在的なエラーメッセージを意図的に破棄したときに、何が問題になったのか、どのようにしてわかりますか? – nvoigt
申し訳ありません。今はすでにNancyModuleとInitCDM()HostingCDM.csに例外を追加しています。しかし、例外はスローされていません。 –