Laden...

remoting klappt nicht

Erstellt von citizen.ron vor 18 Jahren Letzter Beitrag vor 18 Jahren 1.400 Views
citizen.ron Themenstarter:in
432 Beiträge seit 2005
vor 18 Jahren
remoting klappt nicht

hallo,
ich versuche gerade den wirklich allersimpelsten remoting test zu bauen, und der methodenaufruf am remote objekt klappt einfach nicht. an dieser stelle des codes hängt er einfach.

vielleicht weiss jemand von euch weiter?

hier der service:

 
using System;
using System.Text;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;

using RemTest.Business.Components;

namespace RemTest
{
	class Program
   {
		static void Main(string[] args)
		{
			Console.Write("Anwendungsserver wird gestartet...");

      // Server TCP-Kanal auf Port 9200 öffnen
		   TcpServerChannel channel = new TcpServerChannel(9200);
		   ChannelServices.RegisterChannel(channel, true);

	   // Name des .NET Remoting Hosts
		   RemotingConfiguration.ApplicationName = "RemTest";

	   // Geschäftskomponenten für serverseitige Singlecall Aktivierung konfigurieren 
		   RemotingConfiguration.RegisterWellKnownServiceType(typeof(Instanzliste), "Instanzliste", WellKnownObjectMode.SingleCall);

			Console.WriteLine("fertig.");
			Console.ReadLine();
		}

	}
}

hier die im service bereitgestellte Business-Komponente:

 
using System;
using System.Collections.Generic;
using System.Text;

namespace RemTest.Business.Components
{
   public class Instanzliste : MarshalByRefObject
   {
      public int eineZahl(int zahl)
      {
         return zahl + 2;
      }
   }
}

und hier der schaltercode eines formulares der GUI Anwendung, der einfach nur die funktion abrufen soll:

 
      private void btnInstanz_Click(object sender, EventArgs e)
      {
         try
         {
            instanzen = (Instanzliste)Activator.GetObject(typeof(Instanzliste), "tcp://localhost:9200/RemTest/Instanzliste");
         // beim folgenden aufruf hängt das programm, obwohl das objekt instanzen mit einem transparentproxy des korrekten typs belegt ist!
            int zahl = instanzen.eineZahl(3); 
            MessageBox.Show(zahl.ToString() + " Zeilen!");
         }
         catch (Exception exc)
         {
            MessageBox.Show("Fehler");
         }
      }

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo citizen.ron,

ich habs mir jetzt nicht angeguckt, aber vielleicht hilft dir das Beispiel in Dateiassoziation welches funktiniert.

herbivore

citizen.ron Themenstarter:in
432 Beiträge seit 2005
vor 18 Jahren

nope hilft mir nicht, denn rainbirds beispiel funktioniert auch bei mir.

vielleicht noch mal ne meinung **mit **angucken?

gruß

ron

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo citizen.ron,

mit Activator.GetObject holst du dir Zugriff auf ein Objekt, das auf dem Server läuft. Dort läuft aber keins, weil du keins erzeugst. Deshalb wartet der Aufruf vermutlich, bis eins erzeugt ist.

Ansonsten ist mir aufgefallen, dass du wohl mit den Bezeichnungen, die du verwendest, zusätzliche Probleme hast. So müsste es m.E.


RemotingConfiguration.ApplicationName = "Instanzliste";

heißen und als zweiter Paramter von RegisterWellKnownServiceType müsste m.E. die Url und nicht nur einfach "Inszanzliste" übergeben werden.

vielleicht noch mal ne meinung mit angucken?

Den Vorschlag kann ich zurückgeben. 🙂 Guck dir mal mein Beispiel in Dateiassoziation an und leite daraus ab, welche Bezeichnungen, du wo verwenden musst. Es ist m.E. auch keine schlechte Idee, solche Variablen wie strUniqueName zu verwenden und nicht x-mal "Instanzliste" zu schreiben. Das macht es einfacher, den Namen später zu ändern, aber vor allem von Anfang an an allen Stellen konsistent zu halten.

herbivore

citizen.ron Themenstarter:in
432 Beiträge seit 2005
vor 18 Jahren
Remoting klappt doch...

hallo herbivore,

danke für deine meinung,

durch komplettes herunterbrechen von rainbirds anwendung MVCExample habe ich jetzt den kleinen aber zerstörerischen unterschied gefunden:

ChannelServices.RegisterChannel(channel);
ChannelServices.RegisterChannel(channel, true);

Letztere Anweisung habe ich (im Gegensatz zu Rainbird) aufgrund der Compilermeldung verwendet, die (Rainbird´s) Anweisung sei veraltet.
Setzt man das Flag ensureSecurity auf False klappt es.

Werd mich jetzt mal mit dieser Methode auseinandersetzen.

Es ist m.E. auch keine schlechte Idee, solche Variablen wie strUniqueName zu verwenden und nicht x-mal "Instanzliste" zu schreiben. Das macht es einfacher, den Namen später zu ändern, aber vor allem von Anfang an an allen Stellen konsistent zu halten.

klar, normalerweise arbeite ich auch nach dem DRY Prinzip (und verwende auch keine magic numbers), aber hier im forum ging´s ja nur drum, schnell eine lösung zu meinem problem zu finden.

danke jedenfalls,

ron