[C#] Remoting Lifetime

Pagina: 1
Acties:

  • Gertjuhjan
  • Registratie: Juli 2010
  • Laatst online: 03-09 21:26

Gertjuhjan

Software Engineer

Topicstarter
Hallo Allemaal,
Ik ben redelijk nieuw in het programmeren van C#.

Ik ben voor mijn afstudeeropdracht een windows service(noemen we even Server) aan het maken die communiceert via .NET remoting met een windows form(Noemen we even Client). Ik mag van het bedrijf geen gebruik maken van WCF, omdat ze daar nog geen ervaring mee hebben.
Nu moet deze communicatie twee kanten op gaan. Ik heb als basis http://www.codeproject.co...Remoting-Events-Explained voor de communicatie deze gebruikt en geimplementeerd in mijn applicatie.
Ik heb er twee problemen mee.

Probleem 1
Na +/- 5 minuten kan de client geen berichten meer versturen naar de server. De server stuurt wel nog berichten naar de client
Bij het verzenden van een bericht naar de server geeft hij de volgende foutmelding:
code:
1
2
3
4
5
6
7
8
9
10
11
System.Runtime.Remoting.RemotingException: De verbinding met object /serverExample.Rem is verbroken of het object bestaat niet op de server.

Server stack trace: 
   bij System.Runtime.Remoting.Channels.ChannelServices.CheckDisconnectedOrCreateWellKnownObject(IMessage msg)
   bij System.Runtime.Remoting.Channels.ChannelServices.DispatchMessage(IServerChannelSinkStack sinkStack, IMessage msg, IMessage& replyMsg)

Exception rethrown at [0]: 
   bij System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
   bij System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
   bij RemotingEvents.Common.IServerObject.PublishMessage(String Message)
   bij Communication.Communication.connect(String serverip) in C:\Documents and Settings\xxx\Mijn documenten\Visual Studio 2008\Projects\AlarmService\AlarmClient.Communication\Communication.cs:regel 85


Probleem 2
Als ik de client disconnect en opnieuw wil connecten wordt er ook een foutmelding gegeven:
code:
1
2
3
System.Runtime.Remoting.RemotingException: Kanaal remotingClient is niet met externe services geregistreerd.
   bij System.Runtime.Remoting.Channels.ChannelServices.UnregisterChannel(IChannel chnl)
   bij Communication.Communication.disconnect() in C:\Documents and Settings\xxx\Mijn documenten\Visual Studio 2008\Projects\AlarmService\AlarmClient.Communication\Communication.cs:regel 111


De code client side
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
        #region Fields

        IServerObject remoteServer;
        EventProxy eventProxy;
        TcpChannel tcpChan;
        BinaryClientFormatterSinkProvider clientProv;
        BinaryServerFormatterSinkProvider serverProv;
        //string serverip;
        private string serverURI;
        private bool connected = false;
        Encryptie.Encryptie encryp = new Encryptie.Encryptie();

        public event EventHandler<OnMessageConnection> RaiseOnMessageConnection;
        public event EventHandler<OnMessageNieuwAlarm> RaiseOnMessageNieuwAlarm;
        public event EventHandler<OnMessageChangedAlarm> RaiseOnMessageChangedAlarm;
        public event EventHandler<OnMessageUserQuery> RaiseOnMessageUserQuery;
        public event EventHandler<OnMessageAlarmQuery> RaiseOnMessageAlarmQuery;
        public event EventHandler<OnError> RaiseOnError;

        

        #endregion

        #region Initialisatie

        /// <summary>
        /// In deze method wordt de communicatie met de server geïnitialiseerd.
        /// </summary>
        /// <param name="serverip"></param>
        public void Init(string serverip)
        {
            clientProv = new BinaryClientFormatterSinkProvider();
            serverProv = new BinaryServerFormatterSinkProvider();
            serverProv.TypeFilterLevel = System.Runtime.Serialization.Formatters.TypeFilterLevel.Full;

            eventProxy = new EventProxy();
            
            eventProxy.MessageArrived += new MessageArrivedEvent(eventProxy_MessageArrived);
            
            Hashtable props = new Hashtable();
            props["name"] = "remotingClient";
            props["port"] = 0;      //First available port

            serverURI = "tcp://" + serverip + ":15000/serverExample.Rem";        //Replace with your IP

            tcpChan = new TcpChannel(props, clientProv, serverProv);
            
             ChannelServices.RegisterChannel(tcpChan);

            RemotingConfiguration.RegisterWellKnownClientType(new WellKnownClientTypeEntry(typeof(IServerObject), serverURI));
            
        }

        #endregion

        #region Communicatiemethods

        /// <summary>
        /// Deze method kan aangeroepen worden vanuit de client. Deze moet worden aangeroepen bij de start van de applicatie. zonder dit is er geen communicatie mogelijk.
        /// </summary>
        public void connect(string serverip)
        {
            if (connected)
                return;

            try
            {
                remoteServer = (IServerObject)Activator.GetObject(typeof(IServerObject), serverURI);
                remoteServer.PublishMessage("Client Connected");        //This is where it will break if we didn't connect

                remoteServer.MessageArrived += new MessageArrivedEvent(eventProxy.LocallyHandleMessageArrived);
                //sendMessage("Client Connected");
                connected = true;
            }
            catch (Exception ex)
            {
                connected = false;
                OnRaiseOnError(new OnError("Connecting failed!", ex.ToString()));
            }
            //sendMessage("Client Connected");
        }

        /// <summary>
        /// Deze method moet aangeroepen worden bij het afsluiten of verbreken van de verbinding met de server.
        /// </summary>
        public void disconnect()
        {
            if (!connected)
                return;

            try
            {
                remoteServer.MessageArrived -= eventProxy.LocallyHandleMessageArrived;
                //Now we can close it out
                ChannelServices.UnregisterChannel(tcpChan);
                connected = false;
            }
            catch (Exception ex)
            {
                connected = false;
                OnRaiseOnError(new OnError("Disconnect failed!", ex.ToString()));
            }
        }

        /// <summary>
        /// Met deze method kan de client controleren of er verbinding is met de server.
        /// </summary>
        /// <returns></returns>
        public bool IsConnected()
        {
            if (connected == true)
            {
                return true;
            }
            else
            {
                return false;
            }
        }

        /// <summary>
        /// Deze method moet aangeroepen worden om een bericht te encrypten en daarna te verzenden.
        /// </summary>
        /// <param name="message"></param>
        private void sendMessage(string message)
        {
            if (!connected)
                return;
            try
            {
                string encryptedMessage = encryp.EncryptString(message);
                remoteServer.PublishMessage(encryptedMessage);
            }
            catch (RemotingException ex)
            {
                OnRaiseOnError(new OnError("Sendmessage failed!", ex.ToString()));
            }
            catch (Exception ex2)
            {
                OnRaiseOnError(new OnError("Sendmessage failed!", ex2.ToString()));
            }
        }



Wie zou mij bij deze problemen kunnen helpen?

Xbox: Gulpener88


  • pedorus
  • Registratie: Januari 2008
  • Niet online
Je stagebedrijf denk ik, kennelijk hebben ze al ervaring met deze techniek? :p Mocht je het probleem oplossen, dan is het aardig om hier de oplossing ook te posten.

Ik vrees dat er niet veel mensen 150 regels code door gaan spitten (probeer te verkleinen), of overweg kunnen met Nederlandse foutmeldingen (probeer Engelse foutmeldingen te krijgen).

Ik krijg het vermoeden dat de tcp verbinding door iets (router?) is verbroken na verloop van tijd (probleem 1), en dat je deze probeert te sluiten terwijl deze al gesloten is (probleem 2).
Gertjuhjan schreef op donderdag 15 augustus 2013 @ 10:39:
Ik mag van het bedrijf geen gebruik maken van WCF, omdat ze daar nog geen ervaring mee hebben.
Hoe gaan ze dan ooit nieuwe ervaring met iets opdoen als zelfs bij een stageopdracht geen nieuwe technieken gebruikt mogen worden?

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

possible duplicate of AppDomain and MarshalByRefObject life time : how to avoid RemotingException?.

Of: wat heb je zelf al gevonden?

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...


  • Gertjuhjan
  • Registratie: Juli 2010
  • Laatst online: 03-09 21:26

Gertjuhjan

Software Engineer

Topicstarter
pedorus schreef op donderdag 15 augustus 2013 @ 12:36:
Je stagebedrijf denk ik, kennelijk hebben ze al ervaring met deze techniek? :p Mocht je het probleem oplossen, dan is het aardig om hier de oplossing ook te posten.

Ik vrees dat er niet veel mensen 150 regels code door gaan spitten (probeer te verkleinen), of overweg kunnen met Nederlandse foutmeldingen (probeer Engelse foutmeldingen te krijgen).

Ik krijg het vermoeden dat de tcp verbinding door iets (router?) is verbroken na verloop van tijd (probleem 1), en dat je deze probeert te sluiten terwijl deze al gesloten is (probleem 2).


[...]

Hoe gaan ze dan ooit nieuwe ervaring met iets opdoen als zelfs bij een stageopdracht geen nieuwe technieken gebruikt mogen worden?
Bij het programmeren van een product heb je altijd eisen vanuit de opdrachtgever. Of je het nu wilt of niet, je zult je er aan moeten houden.

Ik zou graag mijn foutmeldingen ontvangen in het engels krijgen. Dan is het het makkelijker oplossingen zoeken. Ik zal eens kijken of ik het kan instellen in Visual STudio.
Het kan helaas niet aan de router liggen, want op dit moment is de serverurl localhost.

Xbox: Gulpener88


  • Gertjuhjan
  • Registratie: Juli 2010
  • Laatst online: 03-09 21:26

Gertjuhjan

Software Engineer

Topicstarter
Op die link staat een antwoord dat dat niet de goede manier is. Het is meer een hack dan een goede oplossing.

ik heb ook al i.p.v. return null; bij lifetime services geprobeerd te werken met een lease.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
        public override object InitializeLifetimeService()
        {
            //return null;            //Returning null holds the object alive until it is explicitly destroyed
            var lease = (ILease)base.InitializeLifetimeService();

            if (lease.CurrentState == LeaseState.Initial)
            {
                lease.InitialLeaseTime = TimeSpan.FromMinutes(30);
                lease.SponsorshipTimeout = TimeSpan.FromMinutes(5);
                lease.RenewOnCallTime = TimeSpan.FromSeconds(30);
            }

            return lease;

        }


Maar deze heeft helaas niet de gewenste oplossing gegeven.

Xbox: Gulpener88


Acties:
  • 0 Henk 'm!

  • BtM909
  • Registratie: Juni 2000
  • Niet online

BtM909

Watch out Guys...

Dan wil je ik je toch gaan adviseren om wat meer zelfinzet te tonen.

Zie ook Het algemeen beleid #topicplaatsen en DEBUGGEN DEBUGGEN EN NOG EENS DEBUGGEN ;)

Ace of Base vs Charli XCX - All That She Boom Claps (RMT) | Clean Bandit vs Galantis - I'd Rather Be You (RMT)
You've moved up on my notch-list. You have 1 notch
I have a black belt in Kung Flu.


Acties:
  • 0 Henk 'm!

  • Sircuri
  • Registratie: Oktober 2001
  • Niet online

Sircuri

Volledig Appelig

Dit is duidelijk een lease issue. Ik zit momenteel niet achter mijn laptop, maar wil het zo wel even voor je nakijken. Heb aardig wat gespeeld met remoting i.c.m. cross appdomain applicaties. Kom er op terug.

Signature van nature


Acties:
  • 0 Henk 'm!

  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

Zoals hierboven gezegd, probleem met lifetime.
Probeer voor de grap eens om de tijdspanne op TimeSpan.Zero te zetten?

[ Voor 93% gewijzigd door H!GHGuY op 17-08-2013 09:47 ]

ASSUME makes an ASS out of U and ME


Acties:
  • 0 Henk 'm!

  • Sircuri
  • Registratie: Oktober 2001
  • Niet online

Sircuri

Volledig Appelig

Het eerste wat ik zou doen is het probleem terug schalen. Je zegt dat je codeproject hebt gebruikt als basis. Ik heb daar al mijn vraagtekens bij. Ga je eerst eens verdiepen in de basis van remoting. Mijn remoting clients bestaan uit slechts een handvol code regels en een handvol config regels. Jij post hier 150 regels code.
1. Maak 1 simpele app die een remote object instantieert en gebruikt.
2. Los het timeout / verliezen van connectie probleem op
3. Ga dan pas verder met de functie om de server ook berichten te laten versturen naar de client.

Voor punt 1: MSDN: How to: Build a Client Application

Pagina's van codeproject vind ik doorgaans geen goede locatie om basis zaken te leren. Specifieke problemen kun je daar heel goed vinden. Jij struikelt momenteel nog over de basis van remoting. Verdiep je eerst daarin en begin met stap 1.

Succes ;)

Signature van nature


Acties:
  • 0 Henk 'm!

  • Gertjuhjan
  • Registratie: Juli 2010
  • Laatst online: 03-09 21:26

Gertjuhjan

Software Engineer

Topicstarter
Sircuri schreef op zondag 18 augustus 2013 @ 09:50:
Het eerste wat ik zou doen is het probleem terug schalen. Je zegt dat je codeproject hebt gebruikt als basis. Ik heb daar al mijn vraagtekens bij. Ga je eerst eens verdiepen in de basis van remoting. Mijn remoting clients bestaan uit slechts een handvol code regels en een handvol config regels. Jij post hier 150 regels code.
1. Maak 1 simpele app die een remote object instantieert en gebruikt.
2. Los het timeout / verliezen van connectie probleem op
3. Ga dan pas verder met de functie om de server ook berichten te laten versturen naar de client.

Voor punt 1: MSDN: How to: Build a Client Application

Pagina's van codeproject vind ik doorgaans geen goede locatie om basis zaken te leren. Specifieke problemen kun je daar heel goed vinden. Jij struikelt momenteel nog over de basis van remoting. Verdiep je eerst daarin en begin met stap 1.

Succes ;)
Bedankt voor je reactie.
Ik had al een client - server applicatie gemaakt die maar één kant op ging. Toen heb ik met twee kanten op ook ontwikkeld. Helaas was deze applicatie niet netjes. Van client naar server ging het via TCP en van server naar client ging het via HTTP. Ik zal eens onderzoeken of dit systeem wel langer werkte dan 5 minuten.

Die link die je poste, gebruikt een rare manier om te compilen en vind ik niet een erg duidelijke uitleg.

Xbox: Gulpener88


Acties:
  • 0 Henk 'm!

  • Sircuri
  • Registratie: Oktober 2001
  • Niet online

Sircuri

Volledig Appelig

Het enige rare wat ik eigenlijk kan ontdekken is dat het voorbeeld geen gebruik maakt van Visual Studio maar via de command prompt alles doet. Verder had ik er voor gekozen als voorbeeld om interfaces te gebruiken. Je hebt een implementatie van de server type + een interface op deze server-type. Deze interface compileer je apart in een DLL en die importeer je vervolgens in je client applicatie.

Ga er even voor zitten. Als je nog meer vragen hebt, kun je die natuurlijk gewoon stellen.

Signature van nature

Pagina: 1