Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   C# Remoting eines ECO PerstistenceMapperProviders über den IIS (https://www.delphipraxis.net/79868-remoting-eines-eco-perstistencemapperproviders-ueber-den-iis.html)

Schrammel 30. Okt 2006 09:49


Remoting eines ECO PerstistenceMapperProviders über den IIS
 
Hallo zusammen,

ich habe ein Problem beim Remoting eines ECO PersistenceMapperProviers über den Internet Information Server.

Folgendes passiert:

Ich habe von PersistenceMapperProvider einen RezepteProvider abgeleitet, habe ihm einen ECOSpace-Typ RezepteEcoSpace zugeorndet. diesen ECOSpace lasse ich ein ECO-Package aus einer DLL (RezeptePackage) nutzen.

Das ganze habe ich in eine winforms-Anwendung gepackt, das Remoting aktiviert und: es lief.

Danach habe ich den PersistenceMapper und den EcoSpace in eine DLL ausgelagert, nenne diese RezepteServer.dll und habe dabei folgendes Problem herausgefunden:

Ich weiß nicht mehr, wann ich den EcoSpace erstellen soll. Ich habe dies mal in den Konstruktor des PerstistenceMapperProvider verschoben.

Compilieren - klappt

Nun habe ich beide DLL (RezepteServer und RezeptePackage) nach wwwroot\RezeptServer\bin kopiert.

In der IIS-Steuerkonsole habe ich eine neue Web-Application angelegt, die Nutzungsrechte für den ASP-Nutzer vergeben und in wwwroot folgende web.config angelegt:
XML-Code:
<system.runtime.remoting>
<application>
    <service>
        <wellknown
   mode="SingleCall"
   type="RezepteSpace.RezepteProvider,
RezeptServer"
   objectUri="RezeptProvider.soap" />
 </service>
 <channels>
  <channel
   name="TheChannel"
   priority="100"
   ref="http"
     />
 </channels>
 </application>
</system.runtime.remoting>
Wenn ich nun im IE eingebe:

http://localhost/RezeptServer/RezeptProvider.soap?wsdl

so erwarte, ich dass ich eine Ellenlange xml-Datei angezeigt bekomme. Stattdessen erhalte ich:


System.NullReferenceException: Object reference not set to an instance of an
object.
at
System.Runtime.Remoting.MetadataServices.RealSchem aType.Resolve(StringBuild*er
sb)
at System.Runtime.Remoting.MetadataServices.XMLNamesp ace.Resolve()
at System.Runtime.Remoting.MetadataServices.WsdlGener ator.Resolve()
at System.Runtime.Remoting.MetadataServices.WsdlGener ator.Generate()
at System.Runtime.Remoting.MetadataServices.SUDSGener ator.Generate()
at
System.Runtime.Remoting.MetadataServices.SdlChanne lSink.GenerateSdl(SdlType
sdlType, IServerResponseChannelSinkStack sinkStack, ITransportHeaders
requestHeaders, ITransportHeaders responseHeaders, Stream& outputStream)
at
System.Runtime.Remoting.MetadataServices.SdlChanne lSink.ProcessMessage(ISer*verChannelSinkStack
sinkStack, IMessage requestMsg, ITransportHeaders requestHeaders, Stream
requestStream, IMessage& responseMsg, ITransportHeaders& responseHeaders,
Stream& responseStream)
at
System.Runtime.Remoting.Channels.Http.HttpHandlerT ransportSink.HandleReques*t(HttpContext
context)
at
System.Runtime.Remoting.Channels.Http.HttpRemoting Handler.InternalProcessRe*quest(HttpContext
context)

Was soviel heißt, wie: Das aufgerufene Objekt kann nicht erstellt werden.

Ich vermute, dass diese daran liegt, dass ich den EcoSpace nicht rechtzeitig geöffnet bekomme. Hat jeamd eine Idee, wie ich den EcoSpace beretis beim Laden der Dll, vor der Erstellung des ersten RepzepteProviders erstellen kann?

Herzlichen Dank für Eure Bemühungen

Stefan Schramm

Schrammel 1. Nov 2006 18:21

Re: Remoting eines ECO PerstistenceMapperProviders über den
 
Ladies und Gentlemänner,

ich habe die Lösung. Aber aus dieser ergibt sich eine neue Frage.
Beim Finden der Lösung hat mir Alois Schmid von www.ecospace.de geholfen. Und die Lösung die geht so:

Es muss eine ECO-Space-Instanz bestehen, wenn der PersistenceMapperProvider erstellt wird. Eine Erstellung im Konstruktur ist zu spät.
Der ECO-Space muss beim Abruf des Providers aktiv sein (blablaSpace.Active = true;)

Die Erstellung des ECO-Space habe ich für die Testzwecke in ein getrenntes Managerobjekt gesteckt, das auch von MarshalByRefObject abgeleitet sein muss und das von der Client-Applikation erzeugt wird, bevor diese den PersistenceMapperProvider abruft. Dabei muss man aber aufpassen, dass nicht mehrere ECOSpaces erstellt werden. D.h. man packt das ganze in einen Singleton-Pattern.

Nun läuft das Ganze, aber es ist nicht schön.

Schön wäre es, wenn man das Manager-Objekt nicht brauchen würde oder wenn es automatisch (implizit) erzeugt werde nwürde.

Hieraus ergibt sich meine Frage:

Gibt es unter CSharp, so wie unter Delphi die Möglichkeit, einen Code-Abschnitt beim Laden einer DLL automatisch ausführen zu lassen.
Unter Delphi läuft das, so glaube ich, mit dem initilization-Abschnitt.


Herzlichen Dank für Eure Bemühungen und Eure Hilfen


Stefan Schramm


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:35 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz