Announcement

Collapse
No announcement yet.

Remoting über Internet

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

  • Remoting über Internet

    Hallo zusammen!

    Ich habe eine Client-/Serveranwendung geschrieben, die Remoting benutzt.
    Auf der Severseite habe ich folgendes:
    Code:
    public void RegisterPort(int port)
            {
                string urlEnd = DCTServer.Properties.Settings.Default.LAST_PART_OF_URL;
    
                IDictionary props = new Hashtable();
                BinaryServerFormatterSinkProvider bsfsp =
                    new BinaryServerFormatterSinkProvider();
    
                RemotingConfiguration.CustomErrorsMode = CustomErrorsModes.Off;
                int timeout = DCTServer.Properties.Settings.Default.TIMEOUT_S * 1000;
                props.Add("port", port);
                bsfsp.TypeFilterLevel = TypeFilterLevel.Full;
                props.Add("timeout", timeout);
                props.Add("customErrors", true);
    
                channel = new TcpChannel(props, null, bsfsp);
                ChannelServices.RegisterChannel(channel, false);            
                
                RemotingConfiguration.RegisterWellKnownServiceType(typeof(Server),
                   urlEnd, WellKnownObjectMode.Singleton);
            }
    
    public IServerFunctions Register(string nickname, IClient cf)
            {
                ServerFunctions sf;
                            
                /*
                 * Hier gibt es die SocketException. Der Client meldet sich
                 * nicht mehr...
                 */            
                if(cf.Hello(false))
                {
                    throw new Exception("Hello hat nicht das Argument zurückgegeben.");
                }
                
                sf = new ServerFunctions(nickname);
                return sf;
            }
    Auf der Clientseite folgendes:
    Code:
    public IServerFunctions ConnectToServer(string URI, string nickname, 
                IClient clientFunctions)
            {
                IDictionary props = new Hashtable();
                IServerFunctions serverFunctions;
                int timeout = DCTClient.Properties.Settings.Default.TIMEOUT_S * 1000;
                
                props.Add("port", 5030);
                props.Add("timeout", timeout);
                BinaryClientFormatterSinkProvider bcfsp =
                    new BinaryClientFormatterSinkProvider();
    
                IChannel channel = new TcpChannel(props, bcfsp, null);
                ChannelServices.RegisterChannel(channel, false);
    
                server = (IServer)Activator.GetObject(typeof(IServer),
                    URI);
                serverFunctions = server.Register(nickname, clientFunctions);
                if (serverFunctions.Hello(false))
                {
                    throw new Exception("Methodenaufruf am Server nicht möglich.");
                }
                
                return serverFunctions;
            }
    Wenn sich Client und Server am gleichen PC befinden und ich über localhost gehe, gibt es keine Probleme. Stehen Client und Server aber hinter einem NAT-Router, passiert folgendes:
    Wenn ich vom Client aus am Server Register() aufrufe, dann gibt es eine SocketException an der Stelle, wo der Server den Client mit einem Methodenaufruf zurückrufen soll.

    Vielleicht kennt jemand das Problem und kann mir helfen? Danke
    Martin

  • #2
    das die Exception an der Stelle geworfen wird ist normal! Der RegisterChannel Aufruf ist erst mal Exception free, an dieser Stelle wird also auch noch keine Verbindung hergestellt. Ich würde mal auf ein Firewall Problem tippen.

    Comment


    • #3
      Hallo,

      die Kombination von .NET Remoting und Internet ergibt keinen Sinn. Denn für dieses Szenario sind die XML Web Services (HTTP über Port 80) vorgesehen.

      Außerdem wurde .NET Remoting speziell für rechnerübergreifende Aufrufe mit dem Erscheinen des .NET Framework 3.0 offiziell als "veraltete Technologie, die später nicht mehr unterstützt werden könnte" gekennzeichnet (das neue WCF kann mit .NET Remoting nicht zusammenarbeiten, während alle anderen Altenativen wie XML Web Service und .NET Enterprise Service auch von WCF unterstützt werden). Nur für die .NET-interne Kommunikation zwischen Application Domains des gleichen Prozesses/Rechners ist .NET Remoting auch weiterhin topaktuell.

      Comment

      Working...
      X