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");
}
}
Hallo citizen.ron,
ich habs mir jetzt nicht angeguckt, aber vielleicht hilft dir das Beispiel in Dateiassoziation welches funktiniert.
herbivore
nope hilft mir nicht, denn rainbirds beispiel funktioniert auch bei mir.
vielleicht noch mal ne meinung **mit **angucken?
gruß
ron
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
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