Announcement

Collapse
No announcement yet.

WebService funktioniert teiweisweise

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • WebService funktioniert teiweisweise

    salut, <br>

    ich habe mir mit hilfe des "der Entwickler" (Ausgabe 4/2002) einen Webservice gebastelt. über php und soap greife ich darauf zu. funktioniert auch soweit. ich habe allerdings zwei komponenten auf dem webmodul liegen, die ich für meine verarbeitung brauche. und genau hier ist das problem... in meiner verarbeitung versuche ich auf diese komponenten zuzugfreifen und das schlägt fehl. das webmodul ist NIL und ich weiss eigentlich gar nicht warum. im program-teil wird das ganz normal erzeugt, aber wenn ich meine webservice-funktion anspreche ist es NIL. wenn ich nicht über das Webmodul gehe funktioniert alles, aber da ich halt diese beiden komponenten brauche MUSS ich darauf zugreifen. <br> <br>
    hat jemand ne idee ? <br> <br>
    danke sascha

  • #2
    Hallo,

    &gt; hat jemand ne idee ?

    da die Delphi-Version nicht genannt wurde, mit der gearbeitet wird, muss ich raten :-)

    Generell muss man an dieser Stelle zwischen dem "Host" für den WebService (TWebModule) und der WebService-Objektinstanz unterscheiden. Auf den ersten Blick sieht das alles "harmlos" aus:
    <pre>
    library DE2003WS;

    uses
    ActiveX,
    ComObj,
    WebBroker,
    ISAPIApp,
    ISAPIThreadPool,
    DE2003_WebModule in 'DE2003_WebModule.pas' {WebModule1: TWebModule},
    DE2003ServiceImpl in 'DE2003ServiceImpl.pas',
    DE2003ServiceIntf in 'DE2003ServiceIntf.pas';

    {$R *.res}

    exports
    GetExtensionVersion,
    HttpExtensionProc,
    TerminateExtension;

    begin
    CoInitFlags := COINIT_MULTITHREADED;
    Application.Initialize;
    Application.CreateForm(TWebModule1, WebModule1);
    Application.Run;
    end.
    </pre>
    Die Instanz des TWebModule wird sofort erzeugt - allerdings ist das nur der "Host" für den WebService, der u.a. auch für <i>WSDLHTMLPublish1.ServiceInfo</i> zuständig ist. Dieser "Host" kann beliebig viele Objektinstanzen des WebServices ausführen, wobei aber jede dieser Objektinstanzen für sich lebt. Wenn man sich den Inhalt der Unit mit TWebModule anschaut, fällt auf, dass dort überhaupt nichts von den WebServices zu sehen ist (mit Ausnahme von ServiceInfo). Nur die "Brückenkopf-Komponenten" THTTPSoapDispatcher und THTTPSoapPascalInvoker verrichten ihre Arbeit:
    <pre>
    { SOAP-WebModul }
    unit DE2003_WebModule;

    interface

    uses
    SysUtils, Classes, HTTPApp, InvokeRegistry, WSDLIntf, TypInfo,
    WebServExp, WSDLBind, XMLSchema, WSDLPub, SOAPPasInv, SOAPHTTPPasInv,
    SOAPHTTPDisp, WebBrokerSOAP;

    type
    TWebModule1 = class(TWebModule)
    HTTPSoapDispatcher1: THTTPSoapDispatcher;
    HTTPSoapPascalInvoker1: THTTPSoapPascalInvoker;
    WSDLHTMLPublish1: TWSDLHTMLPublish;
    procedure WebModule1DefaultHandlerAction(Sender: TObject;
    Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
    private
    { Private-Deklarationen }
    public
    { Public-Deklarationen }
    end;

    var
    WebModule1: TWebModule1;

    implementation

    {$R *.dfm}

    procedure TWebModule1.WebModule1DefaultHandlerAction(Sender: TObject;
    Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
    begin
    WSDLHTMLPublish1.ServiceInfo(Sender, Request, Response, Handled);
    end;

    end.
    </pre>

    &gt;aber da ich halt diese beiden komponenten brauche MUSS ich darauf zugreifen. ..

    Was sind das für Komponenten? Warum wird nicht ein ganz normales <b>zusätzliches</b> Datenmodul genutzt, dass innerhalb der Interface-Methode des WebServides von Hand erzeugt/zerstört wird. In diesem Fall kontrolliert man selbst die Lebensdauer dieses Teils, so dass es niemals zu ungewollten Kollisionen kommen kann

    Comment


    • #3
      hallo herr kosch, <br>
      wir arbeiten mit delphi 6 (Update Pack 2). <br>
      bei den komponenten handelt es sich um DOM-xml-parser-komponenten.<br>
      ich wollte es vermeiden diese zur laufzeit zu erzeugen und ihre idee <br> das zusätzliche datenmodul per hand zu erzeugen ist ja ähnlich. <br>ich habe es jetzt so gelöst, dass ich die gesamte verarbeitung in <br>eine DLL verlagert habe. sprich: der web-service selbst ist nur <br> noch die schnittstelle. die xml-verarbeitung steckt nun in der DLL. <br>
      <br>
      das ist jetzt nicht sooooo elegant, aber es funktioniert ;o) <br> <br>
      vielen dank <br>
      sascha lohau

      Comment

      Working...
      X