RemotingException - alles Sch$§%# !!!! ;)
-
Hoi, ich kann mir eine RemotingException nicht so ganz erklären. Google gibt auch erstaunlich wenig her und noch weniger für mich brauchbares. Vielleicht hat einer hier schon dieses Problem gehabt und kann mir helfen.
Das Problem ist definitiv, dass der Server mit der empfangenen Referenz auf das Client-this eine Methode aufruft. Wenn ich das nicht tue, ist alles in Ordnung.Server:
BinaryServerFormatterSinkProvider provider = new BinaryServerFormatterSinkProvider(); provider.TypeFilterLevel = TypeFilterLevel.Full; channel = new TcpServerChannel("abc", port, provider); ChannelServices.RegisterChannel(channel); RemotingConfiguration.RegisterWellKnownServiceType( typeof(Server), "test.rem", WellKnownObjectMode.Singleton );
Client:
[cs] BinaryClientFormatterSinkProvider provider =
new BinaryClientFormatterSinkProvider();
this.channel = new TcpClientChannel("xyz", provider);
ChannelServices.RegisterChannel(channel);string host = "tcp://" + remoteComputer + ":" + port + "/test.rem";
this.server = (IGameServer)Activator.GetObject(typeof(IServer), host);
server.clientJoin(this); // Server ruft dann mit dem Parameter ne Methode auf, was den Ärger verursacht[/cs]
An unhandled exception of type 'System.Runtime.Remoting.RemotingException' occurred in mscorlib.dll
Additional information: This remoting proxy has no channel sink which means either the server has no registered server channels that are listening, or this application has no suitable client channel to talk to the server.
Folgende Information habe ich dazu im Internet gefunden:
http://www.cookcomputing.com/blog/archives/000308.html schrieb:
The exception is thrown because there is no remoting channel back to the client through which the server can make the call. Solution: register a channel on the client via a call to ChannelServices.RegisterChannel.
Jetzt ist die Frage, was das soll. Schließlich habe ich ja beim Client einen Channel offen. Was passt an dem nicht?
Ich habe auch mal versucht, sowohl beim Server als auch beim Client jeweils nen TcpChannel zu verwenden und eigene FormatterSinkProvider im Konstruktor zu übergeben, aber das Problem bleibt.
-
Optimizer schrieb:
Server:
[cs] BinaryServerFormatterSinkProvider provider =
new BinaryServerFormatterSinkProvider();
provider.TypeFilterLevel = TypeFilterLevel.Full;
channel = new TcpServerChannel("abc", port, provider);
ChannelServices.RegisterChannel(channel); RemotingConfiguration.RegisterWellKnownServiceType(
typeof(Server),
"test.rem",
WellKnownObjectMode.Singleton );[/cs]Client:
[cs] BinaryClientFormatterSinkProvider provider =
new BinaryClientFormatterSinkProvider();
this.channel = new TcpClientChannel("xyz", provider);
ChannelServices.RegisterChannel(channel);
string host = "tcp://" + remoteComputer + ":" + port + "/test.rem";
this.server = (IGameServer)Activator.GetObject(typeof(IServer), host);
server.clientJoin(this); // Server ruft dann mit dem Parameter ne Methode auf, was den Ärger verursacht[/cs]
na merkst du den unterschied?
-
Falls sich das auf den Channel-Namen bezieht, das ist wohl nicht die Ursache gewesen.
Der Punkt ist auch der, dass alles wunderbar klappt, bis zu dem Zeitpunkt, wo der Server eine Methode auf das Objekt aufruft, von dem er vom Client die Referenz bekommt.
-
Ok, ich hab's jetzt hingekriegt, hat nur 2 Tage gedauert. ;/
Ich war mit den TcpChannels schon auf der richtigen Spur, weil die einen TcpClientChannel und einen TcpServerChannel so wrappen, dass der TcpClientChannel des Servers gleich so konfiguriert wird, dass er an den TcpServerChannel des Clients senden kann.
Warum es damals nicht geklappt hat, kann ich nicht mehr ganz rekonstruieren, aber ich hatte da auch mit Security-Shit erstmal zu kämpfen und das hat mich wahrscheinlich zu sehr abgelenkt.
Also Merke: TcpChannel verwenden, wenn zwei Rechner von sich gegenseitig Methoden aufrufen sollen. *merk*Naja, interessiert ja eh keinen.