Laden...

Remoting problem: service unavailable????

Erstellt von Tosek vor 17 Jahren Letzter Beitrag vor 17 Jahren 1.639 Views
T
Tosek Themenstarter:in
38 Beiträge seit 2006
vor 17 Jahren
Remoting problem: service unavailable????

hallo zusammen,

ich habe ein problem mit .NET remoting, welches ich bisher nicht lösen kann:

Ich habe eine remoting programm, bestehend aus server und client geschrieben. Ein Client kann vom Server eine Ergebnisliste anfordern. Diese wird in einem komplexen Object zurückgegeben. Das funktionieert soweit auch prima.
Leider bekomme ich nach einiger Zeit (zwischendurch den client mehrfach gestartet, Liste angefordert, gewartet etc.) die Meldung, dass der (Remoting-)Service nicht verfügbar sei.

Ich dachte schon an ein lifetime Problem und habe deswegen Debug ausgaben im destructor des remoting objectes gemacht, aber dieser scheint nicht aufgerufen zu werden (erst wenn ich den server beende).

hat irgendjemand eine Idee, was ich tun kann?

Hier der relevante code:



[Serializable]
public class AgentHost : System.MarshalByRefObject    // this is my main server object
{
public AgentResult GetMessage(String Name)
{ // do something}
}

[Serializable]
public class AgentResult : MarshalByRefObject   // This is my complex return object
{
public String[] m_Label;
public String[] m_Path;
public String[] m_AgentID;
public String[] m_Itemtype;
public AgentResult()
{}
public AgentResult(AgentResult o)   // "copy" constructor
{
m_Label = new String[o.m_Label.Length];
o.m_Label.CopyTo(m_Label,0);
m_Path = new String[o.m_Path.Length];
o.m_Path.CopyTo(m_Path,0);
m_AgentID = new String[o.m_AgentID.Length];
o.m_AgentID.CopyTo(m_AgentID, 0);
m_Itemtype = new String[o.m_Itemtype.Length];
o.m_Itemtype.CopyTo(m_Itemtype, 0);
}
}

// This is how my server instanciates the server object

TcpChannel tcpChannel = new TcpChannel(7777);
ChannelServices.RegisterChannel(tcpChannel);
AgentHost agentHost = new AgentHost();RemotingServices.Marshal(agentHost, "BrokerAgent");
Console.ReadLine();   // run server until "return" is pressed 

// now the client side
AgentHost agentHost = null;
agentHost = (AgentHost)(RemotingServices.Connect(typeof(AgentHost), "tcp://localhost:7777/BrokerAgent", agentHost));
AgentResult agentResult = agentHost.GetMessage("Test");


Beste Grüße
Tosek

There are 10 diffent types of people in this world: Those who understand binary and those who don't....

2.891 Beiträge seit 2004
vor 17 Jahren

Da GarbageCollection über Remoting nicht so einfach ist, wird standardmäßig dein Objekt nach einiger Zeit automatisch verworfen, wenn du dich nicht selbst um den Lifecycle kümmerst.
Einfach folgendes in deinem MarshalByRefObject machen:

/// <summary>
/// Die Lebensdauer dieses Objekts nicht begrenzen
/// </summary>
public override object InitializeLifetimeService()
{
	return null;
}

Gruß
dN!3L

3.728 Beiträge seit 2005
vor 17 Jahren
Direct Remoting

Du verwendest "Direct Remoting". Wenn die Lease-gesteuerte Lebenszeit Deiner direkt gemarshallten Instanz abgelaufen ist, wird diese vom Garbage Collector abgeräumt. Der Remoting Host denkt, dass diese Instanz nicht länger benötigt wird und nur unnötig Ressourcen verbraucht.

Du solltest die Klasse lieber als serveraktivierten Singleton laufen lassen. Dann kümmert sich die Remoting-Infrastruktur um erzeugen und zerstören der Objekte. Deine Clients werden dann immer ein Objekt haben, welches ihre Anfragen verarbeitet. Bei Direct Remoting bist Du selber für die Lebenszeit-Verwaltung verantwortlich (Aber das willst Du gar nicht, da Remoting das viel besser machen kann, als Du!). Falls Du aber ein "Controll-Freak" 😉 sein solltest, wird Dir die Lösung von dN!3L bestimmt weiterhelfen.

T
Tosek Themenstarter:in
38 Beiträge seit 2006
vor 17 Jahren
Danke

Hallo,

danke für die Hilfe.

Da mein Object im Server solange leben soll wie der Server selbst ist der Tip mit dem Lifetime schon genau passend, denke ich. Es scheint auch prima zu funktionieren. Der Server läuft nun problemlos seit 24 Std.

Sobald die WCF released ist, werde ich natürlich drüber nachdenken die Archivtektur daraufhin nochmals zu ünerdenken.

Gruß
Tosek

There are 10 diffent types of people in this world: Those who understand binary and those who don't....

S
8.746 Beiträge seit 2005
vor 17 Jahren

WCF ist praktisch stable. Macht Sinn sich schon jetzt damit auseinanderzusetzen.