2012-10-25 4 views
6

ich bin versuchen, eine DataSnap Erholung Anwendung für den Aufbau als Windows-Dienst ausgeführt wird, aber der Assistent hat nur „Stand-alone VCL-Anwendung“, „Stand-alone-Konsolenanwendung“ und „ISAPI Dynamic Link Library "(Ich verwende Delphi XE2 Enterprise). Jemand kann mir helfen. Vielen Dank.DataSnap Rast Server Windows-Dienst

+1

Warum die Nähe Wünsche? Wie ist diese Frage nicht konstruktiv? –

Antwort

4

Es wäre bequemer, wenn der DataSnap-REST-Assistent die Option hätte, einen Windows-Dienst zu erstellen (wie sonst würden Sie einen Anwendungsserver ausführen?), Aber Sie können mit ein wenig Fiedeln umgehen.

Beim ersten Mal habe ich einen regulären DataSnap-REST-Server als VCL-Anwendung und einen regulären Windows-Dienst erstellt und die relevanten Teile vom REST-Server zum Dienst kopiert. Stellen Sie nur sicher, dass das Ausgabeverzeichnis für den Service mit dem Verzeichnis für die VCL-Anwendung identisch ist.

Der .dpr Dienst könnte wie folgt aussehen:

program Service; 

uses 
    Vcl.SvcMgr, 
    Web.WebReq, 
    IdHTTPWebBrokerBridge, 
    WebModuleUnit1 in '..\GUI\WebModuleUnit1.pas' {WebModule1: TWebModule}, 
    ServerMethodsUnit1 in '..\GUI\ServerMethodsUnit1.pas' {ServerMethods1: TDSServerModule}, 
    ServerContainerUnit1 in '..\GUI\ServerContainerUnit1.pas' {ServerContainer1: TDataModule}, 
    Unit1 in 'Unit1.pas' {Service1: TService}; 

{$R *.RES} 

begin 
    if not Application.DelayInitialize or Application.Installing then 
    Application.Initialize; 

    if WebRequestHandler <> nil then 
    WebRequestHandler.WebModuleClass := WebModuleClass; 

    Application.CreateForm(TService1, Service1); 
    Application.Run; 
end. 

Die Haupteinheit des Service könnte wie folgt aussehen:

unit Unit1; 

interface 

uses 
    Winapi.Windows, Winapi.Messages, System.SysUtils, System.Classes, 
    Vcl.Graphics, Vcl.Controls, Vcl.SvcMgr, Vcl.Dialogs, 
    IdHTTPWebBrokerBridge, Web.HTTPApp; 

type 
    TService1 = class(TService) 
    procedure ServiceCreate(Sender: TObject); 
    procedure ServiceExecute(Sender: TService); 
    procedure ServiceStart(Sender: TService; var Started: Boolean); 
    procedure ServiceStop(Sender: TService; var Stopped: Boolean); 
    private 
    FServer: TIdHTTPWebBrokerBridge; 
    procedure TerminateThreads; 
    public 
    function GetServiceController: TServiceController; override; 
    end; 

var 
    Service1: TService1; 

implementation 

{$R *.DFM} 

uses 
    //Datasnap.DSService; // XE2 
    Datasnap.DSSession; // XE3 

procedure ServiceController(CtrlCode: DWord); stdcall; 
begin 
    Service1.Controller(CtrlCode); 
end; 

{ TService1} 

function TService1.GetServiceController: TServiceController; 
begin 
    Result := ServiceController; 
end; 

procedure TService1.ServiceCreate(Sender: TObject); 
begin 
    FServer := TIdHTTPWebBrokerBridge.Create(Self); 
end; 

procedure TService1.ServiceExecute(Sender: TService); 
begin 
    while not Terminated do 
    begin 
    Sleep(1000); 
    ServiceThread.ProcessRequests(False); 
    end; 
end; 

procedure TService1.ServiceStart(Sender: TService; var Started: Boolean); 
begin 
    if not FServer.Active then 
    begin 
    FServer.Bindings.Clear; 
    FServer.DefaultPort := 8080; 
    FServer.Active := True; 
    end; 
end; 

procedure TService1.ServiceStop(Sender: TService; var Stopped: Boolean); 
begin 
    TerminateThreads; 
    FServer.Active := False; 
    FServer.Bindings.Clear; 

    ServiceThread.Terminate; 
end; 

procedure TService1.TerminateThreads; 
begin 
    if TDSSessionManager.Instance <> nil then 
    TDSSessionManager.Instance.TerminateAllSessions; 
end; 

end. 
+0

kann Service1.ServiceExecute 'leer' (ohne Code) gelassen werden? – mjn

+0

mjn: Ziemlich sicher kann es. –

+0

danke, ich werde es versuchen – JoFan

Verwandte Themen