Frage

Dies ist etwa, wenn eine .NET-Remote Ausnahme ausgelöst. Wenn Sie einen Blick auf MSDN nehmen, wird es erwähnt, dass eine Remote Ausnahme ausgelöst, wenn etwas schief geht mit Remoting. Wenn mein Server nicht ausgeführt wird, erhalte ich eine Steckdose Ausnahme, die in Ordnung ist.

Was ich versuche, herauszufinden, ist: nicht immer eine Ausnahme Remote angeben sicher, dass mein Server ist und läuft? Wenn ja, das würde das Problem lösen. Wenn nicht: Gibt es eine Möglichkeit, um herauszufinden, ob die Remote Ausnahme auf der Client-Seite entstanden oder die Server-Seite

Update:

Das Problem, das ich zu lösen versuche, ist, dass der Server zunächst und dann sendet Client zum Server eine Nachricht. Jetzt bekomme ich eine Fassung Ausnahme sagen: „Keine Verbindung gemacht werden könnte ...“ was in Ordnung ist.

Es gibt einen Thread, die Nachrichten an den Server in regelmäßigen Abständen senden, um zu sehen, ob der Server verfügbar ist. Nun kommt der Server, und an diesem Punkt, können Sie die Antwort erhalten, die in Ordnung ist, oder Sie können einig Ausnahme bekommen und wahrscheinlich wird es eine Fern Ausnahme sein. Also, was ich versuche zu fragen ist, dass: falls ich nicht bekommen eine Nachricht und ich bekomme eine Fern Ausnahme gibt es eine Chance, dass der Server und läuft und ich bin immer noch, diese Ausnahme zu bekommen?

Alles, was ich tue, ist nur eine Methode auf dem Remote-Objekt aufrufen, die nichts und kehrt tut. Wenn es keine Ausnahme ist, dann bin ich gut. Nun, wenn es eine Remote Ausnahme ist, und wenn ich die Remote Ausnahme wusste auf dem Server aufgetreten dann weiß ich, trotz der Ausnahme immer, ich bin mit dem Server verbunden.

War es hilfreich?

Lösung

Wie Sie eine Remote Ausnahme nimmt keine Garantie dafür, dass der Server ist und läuft. Wenn sonst etwas passiert auf diesem Port zu laufen und zu hören, wird die Verbindung erfolgreich zu sein, und Sie werden keine Socket-Exception. Was in diesem Fall geschieht, hängt davon ab, wie die Anwendung, die tatsächlich bekam die Verbindung verhält, aber es wird wahrscheinlich aufzuwickeln eine Remote Ausnahme in Ihrem Client zu erzeugen.

Es wäre ein bisschen mehr Untersuchung nehmen, dies zu überprüfen, aber ich glaube, die Remoting-Ausnahme ein Problem in der Kommunikation zwischen dem Client und dem Server gibt, so gibt es keine „Client-Seite“ oder „Server-Seite“, die erzeugen es. Es bedeutet, dass die beide nicht sprechen glücklich und es könnte durch eines verursacht wurde.

Andere Tipps

Wenn Sie beabsichtigen, benutzerdefinierte Ausnahmetypen zu verwenden, über den Remote boundray geworfen werden, sollten Sie diese Art als „[Serializable]“ markieren. Ich kann die genaue Fehlermeldung nicht mehr erinnern, aber es verwirrt mich für den besseren Teil eines Tages das erste Mal sah ich es.

Auch nur ein Tipp, hat TargetInvocationException oft die REAL Ausnahme in seiner Innerexception-Eigenschaft eingebettet. Es gibt nichts mehr nutzlos als „Eine Ausnahme durch das Ziel für einen Aufruf ausgelöst wurde.“

Versuchen

sicherzustellen, dass Sie die richtige Botschaft senden und die Nachrichten vom Server empfangen sind auch richtig, z.B. mit Behauptungen (es Design by Contract genannt wird). Wenn Sie eine solche Möglichkeit haben, versuchen Sie den Server Debugging Seite und Client-Seite zur gleichen Zeit. (Läuft zwei VS-Instanzen zur gleichen Zeit)

ich habe keinen Zugriff auf den Quellcode meiner letzten Remoteanwendung, aber soweit ich konnten wir erinnern kann keine Möglichkeit zu wissen, für bestimmte herauszufinden, ob der Server von einem der Ausnahme war wir bekamen .
Wir haben überprüfen, um zu sehen, ob das Netzwerk vorhanden war und davor gewarnt, den Benutzer, wenn nicht (ein Verfahren für Umweltklasse glaube ich).

Wenn die serverseitige Anwendungslogik eine Ausnahme ausgelöst hat, sollte es in der Lage sein, an den Client Marschall über es wissen zu lassen, was passiert ist. Sie können dies testen, indem er bewusst eine Ausnahme in einem der Remote-Objektmethoden zu werfen. Dann rufen Sie diese spezielle Methode von der Client-Seite eine Ausnahme erwarten:

HttpChannel channel = new HttpChannel();
ChannelServices.RegisterChannel(channel);

IMyRemoteObject obj = (IMyRemoteObject) Activator.GetObject(
    typeof(IMyRemoteObject),
    "http://localhost:1234/MyRemoteObject.soap");
Console.WriteLine("Client.Main(): Reference to rem.obj. acquired");
    int tmp = obj.GetValue();
    Console.WriteLine("Client.Main(): Original server side value: {0}",tmp);
Console.WriteLine("Client.Main(): Will set value to 42");

try
{
    // This method will throw an ApplicationException in the server-side code.
    obj.SetValue(42);
}
catch (Exception ex)
{
    Console.WriteLine("=====");
    Console.WriteLine("Exception type: " + ex.GetType().ToString());
    Console.WriteLine("Message: " + ex.Message);
    Console.WriteLine("Source: " + ex.Source);
    Console.WriteLine("Stack trace: " + ex.StackTrace);
    Console.WriteLine("=====");
}

Sie können eine Ausnahme wie diese erhalten erwarten

=====
Exception type: System.ApplicationException
Message: testing
Source: Server
Stack trace:
Server stack trace:
   at Server.MyRemoteObject.SetValue(Int32 newval) in i:\projects\remoting.net\ch03\01_singlecallobjects\server\server.cs:line 27
   at System.Runtime.Remoting.Messaging.StackBuilderSink.PrivateProcessMessage(MethodBase mb, Object[] args, Object server, Int32 methodPtr, Boolean fExecuteInContext, Object[]& outArgs)
   at System.Runtime.Remoting.Messaging.StackBuilderSink.SyncProcessMessage(IMessage msg, Int32 methodPtr, Boolean fExecuteInContext)

Exception rethrown at [0]:
   at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
   at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
   at General.IMyRemoteObject.SetValue(Int32 newval)
   at Client.Client.Main(String[] args) in i:\projects\remoting.net\ch03\01_singlecallobjects\client\client.cs:line 29
=====

Es sollte Ihnen sagen, die Quelle ist auf dem Server, mit einem serverseitigen Stack-Trace.

Ok jetzt, dass man es so sagen haben, ich nehme an, Sie verwenden TCP für Remote sind, denn wenn es über HTTP war, wäre es ein WebException geworfen werden, wenn sie der (TCP Netzwerk-Port) Server verbinden ausfällt. Wenn der Server das Anwendungsprogramm nicht gestartet, um den Kanal auf diesem bezeichneten TCP-Port zu registrieren, erhalten Sie eine Socket erhalten. Schließlich wird der Server hört auf diesen Port nicht / reagiert, wie kann immer der Client eine Socket-Verbindung machen?

Aber, wenn Sie einen Remoting bekommen es brauchen nicht bedeutet notwendigerweise der Server seine richtige Remoteanwendung läuft gut hat. Sie könnten testen, indem Sie auf einem falschen Anschluss an eine falsche URI verbindet, wie Port 80 (IIS).

IMyRemoteObject obj = (IMyRemoteObject) Activator.GetObject(
    typeof(IMyRemoteObject),
    "tcp://localhost:80/MyRemoteObject.rem");

Das in einem Remoting führen würde, weil während des Client eine TCP-Verbindung auf Port 80 machen, es ist IIS auf den Ruf reagiert und nicht die Remoting-App; IIS kann remoting Anrufe direkt nicht umgehen. Having said that, kann ein Remoting auch jolly ein Problem auf der Client-Seite bedeuten. Dieser Blog-Artikel können Sie helfen, besser zu verstehen.

http://www.cookcomputing.com/blog/archives/000308.html

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top