.NET Remoting изключение

Това се отнася за случаите, когато се хвърля изключение за отдалечено управление на .NET. Ако погледнете MSDN, ще се спомене, че се хвърля изключение за отдалечено управление, когато нещо се обърка с отдалеченото. Ако сървърът ми не работи, получавам изключение за сокет, което е добре.

Това, което се опитвам да разбера е: получаването на изключение за отдалечено управление показва ли със сигурност, че моят сървър е готов и работи? Ако да, това ще реши проблема. Ако не: Има ли начин да разберете дали изключението за отдалечено управление е възникнало от страната на клиента или от страната на сървъра?

Актуализация:

Проблемът, който се опитвам да разреша е, че сървърът първоначално не работи и след това клиентът изпраща някакво съобщение до сървъра. Сега получавам изключение за сокет, което казва, че не може да се направи връзка... което е добре.

Има нишка, която изпраща съобщения до сървъра на редовни интервали, за да види дали сървърът е достъпен. Сега сървърът се появява и в този момент можете да получите отговора, който е добре, или можете да получите някакво изключение и най-вероятно то ще бъде отдалечено изключение. И така, това, което се опитвам да попитам, е следното: в случай че не получа съобщение и получа отдалечено изключение, има ли шанс сървърът да работи и да продължава да получава това изключение?

Всичко, което правя, е просто да извикам метод на отдалечения обект, който не прави нищо и се връща. Ако няма изключение, значи съм добър. Сега, ако има изключение за отдалечено управление и ако знаех, че изключението за отдалечено управление е настъпило на сървъра, тогава знам, че въпреки получаването на изключението съм свързан със сървъра.


person Community    schedule 16.09.2008    source източник
comment
Може би трябва да преименувате въпроса. Не е много описателен   -  person Johnno Nolan    schedule 16.09.2008


Отговори (6)


Получаването на изключение за отдалечено управление не гарантира, че вашият сървър е готов и работи. Ако нещо друго работи и слуша на този порт, връзката ще успее и няма да получите изключение за сокет. Какво ще се случи в този случай зависи от това как се държи приложението, което действително е получило вашата връзка, но вероятно ще генерира изключение за отдалечено управление във вашия клиент.

Ще е необходимо малко повече разследване, за да се провери това, но вярвам, че изключението за отдалечено управление показва проблем в комуникациите между клиента и сървъра, така че няма „клиентска страна“ или „сървърна страна“, които са го генерирали. Това означава, че двамата не са разговаряли щастливо и това може да е причинено от всеки от двамата.

person Thomee    schedule 16.09.2008
comment
Ако приемем, че нищо друго не работи на порта, освен отдалечения сървър, все още смятам, че отдалеченото изключение може да не е индикация, че сървърът работи и е готов за сървърни заявки. Прав ли съм? затова си мислех дали има начин да разбера дали е възникнало изключение на сървъра - person ; 17.09.2008

Ако възнамерявате да използвате потребителски типове изключения, които да бъдат хвърлени през границата на отдалечено управление, не забравяйте да маркирате тези типове като „[Serializable]“. Не мога да си спомня точното съобщение за грешка, но ме обърка през по-голямата част от деня, когато го видях за първи път.

Също така, само един съвет, TargetInvocationException често има изключение REAL, вградено в свойството InnerException. Няма нищо по-безполезно от "Изключение е хвърлено от целта на извикване."

person Steve Dinn    schedule 16.09.2008
comment
Хаха да, кажете ми нещо, което името на типа изключение вече не го казва. - person icelava; 16.09.2008

Опитайте се да се уверите, че изпращате правилното съобщение и съобщенията, получени от сървъра, също са правилни, напр. използване на твърдения (нарича се проектиране чрез договор). Ако имате такава възможност, опитайте да отстраните грешки от страната на сървъра и страната на клиента едновременно. (извършване на два VS екземпляра едновременно)

person sumek    schedule 16.09.2008

Нямам достъп до изходния код на последното си отдалечено приложение, но доколкото си спомням, не можахме да намерим начин да разберем със сигурност дали сървърът работи от някое от изключенията, които получихме.
Проверихме дали мрежата присъства и предупредихме потребителя, ако не (мисля, че метод в класа на околната среда).

person Rikalous    schedule 16.09.2008

Ако логиката на приложението от страна на сървъра хвърли изключение, то трябва да може да се прехвърли към клиента, за да го уведоми какво се е случило. Можете да тествате това, като съзнателно хвърлите изключение в един от методите на отдалечения обект. След това извикайте този конкретен метод от страна на клиента, очаквайки изключение:

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("=====");
}

Можете да очаквате изключение, получено по този начин

=====
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
=====

Трябва да ви каже, че източникът е на сървъра, с проследяване на стека от страна на сървъра.

person icelava    schedule 16.09.2008
comment
Работата е там, че ако методът на отдалечения обект успее, тогава няма проблем там. Предполагам, че няма нужда да хвърляте изключение за тази цел. - person ; 17.09.2008
comment
Вижте другия ми (по-късен) пост. - person icelava; 18.09.2008

Добре сега, след като го поставихте по този начин, предполагам, че използвате TCP за отдалечено управление, защото ако беше чрез HTTP, щеше да бъде WebException, хвърлен при неуспешно свързване към сървъра (TCP мрежов порт). Когато сървърът не е стартирал приложната програма за регистриране на канала на посочения TCP порт, ще получите SocketException. В края на краищата, сървърът не слуша/отговаря на този порт, как може клиентът някога да осъществи връзка със сокет?

Но ако получите RemotingException, това трябва да не непременно означава, че сървърът има своето правилно приложение за отдалечено управление, което работи добре. Можете да тествате, като се свържете с грешен URI на грешен порт, като порт 80 (IIS).

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

Това би довело до RemotingException, тъй като докато клиентът може да направи TCP връзка към порт 80, IIS отговаря на повикването, а не приложението Remoting; IIS не може да обработва директно отдалечени повиквания. Като каза това, RemotingException също може да означава проблем от страна на клиента. Тази статия в блога може да ви помогне да разберете по-добре.

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

person icelava    schedule 16.09.2008