문제

이는 .NET 원격 예외가 발생하는 경우에 관한 것입니다.MSDN을 살펴보면 원격에 문제가 있을 때 원격 예외가 발생한다고 언급되어 있습니다.내 서버가 실행되고 있지 않으면 소켓 예외가 발생하지만 괜찮습니다.

내가 알아내려고 하는 것은 다음과 같습니다.원격 예외가 발생하면 내 서버가 제대로 작동하고 있음을 의미합니까?그렇다면 문제가 해결될 것입니다.그렇지 않은 경우:원격 예외가 클라이언트 측에서 발생했는지 아니면 서버 측에서 발생했는지 알아낼 수 있는 방법이 있습니까?

업데이트:

내가 해결하려는 문제는 처음에는 서버가 다운된 다음 클라이언트가 서버에 일부 메시지를 보내는 것입니다.이제 "연결할 수 없습니다..."라는 소켓 예외가 발생합니다. 이는 괜찮습니다.

서버가 사용 가능한지 확인하기 위해 정기적으로 서버에 메시지를 보내는 스레드가 있습니다.이제 서버가 나타나면 그 시점에서 괜찮은 응답을 받거나 일부 예외가 발생할 수 있으며 이는 아마도 원격 예외일 것입니다.그래서 제가 묻고 싶은 것은 다음과 같습니다.메시지를 받지 못했는데 원격 예외가 발생한 경우 서버가 실행 중인데 여전히 이 예외가 발생할 가능성이 있습니까?

내가 하고 있는 일은 아무것도 하지 않고 반환하는 원격 개체에 대한 메서드를 호출하는 것뿐입니다.예외가 없다면 나는 좋다.이제 원격 예외가 있고 서버에서 원격 예외가 발생했다는 것을 알았다면 예외가 발생했음에도 불구하고 서버에 연결되어 있음을 알 수 있습니다.

도움이 되었습니까?

해결책

원격 예외가 발생한다고 해서 서버가 실행 중임을 보장하는 것은 아닙니다.해당 포트에서 다른 작업이 실행되고 수신 대기하는 경우 연결이 성공하고 소켓 예외가 발생하지 않습니다.이 경우 발생하는 상황은 실제로 연결을 얻은 애플리케이션의 작동 방식에 따라 다르지만 클라이언트에서 원격 예외가 생성될 가능성이 높습니다.

이를 확인하려면 좀 더 조사가 필요하지만 원격 예외는 클라이언트와 서버 간의 통신에 문제가 있음을 나타내므로 이를 생성한 "클라이언트 측"이나 "서버 측"이 없다고 생각합니다.두 사람이 즐거운 대화를 나누지 않았다는 뜻이고, 둘 중 어느 한 쪽이 원인일 수도 있다.

다른 팁

원격 경계를 넘어 발생하는 사용자 지정 예외 유형을 사용하려는 경우 이러한 유형을 "[직렬화 가능]"으로 표시해야 합니다.정확한 오류 메시지를 기억할 수는 없지만 처음 봤을 때 하루 종일 당황스러웠습니다.

또한 팁을 드리자면 TargetInvocationException에는 종종 InnerException 속성에 REAL 예외가 포함되어 있습니다."호출 대상에서 예외가 발생했습니다."보다 더 쓸모없는 것은 없습니다.

올바른 메시지를 보냈는지, 서버에서 받은 메시지도 올바른지 확인하세요.주장을 사용합니다(계약에 의한 설계라고 함).그러한 가능성이 있는 경우 서버측과 클라이언트측을 동시에 디버깅해 보십시오.(동시에 두 개의 VS 인스턴스 실행)

나는 마지막 원격 응용 프로그램의 소스 코드에 액세스할 수 없었지만, 내가 기억하는 한 서버가 우리가 받은 예외로부터 작동 중인지 확실하게 알 수 있는 방법을 찾을 수 없었습니다.
우리는 네트워크가 있는지 확인하고 그렇지 않은 경우 사용자에게 경고했습니다(내 생각에는 Environment 클래스의 메서드).

서버 측 애플리케이션 로직이 예외를 발생시킨 경우 클라이언트에 마샬링하여 무슨 일이 일어났는지 알릴 수 있어야 합니다.원격 개체의 메서드 중 하나에서 의도적으로 예외를 발생시켜 이를 테스트할 수 있습니다.그런 다음 예외가 발생할 것으로 예상되는 클라이언트 측에서 특정 메서드를 호출합니다.

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

서버 측 스택 추적을 통해 소스가 서버에 있음을 알려야 합니다.

이제 그렇게 말씀하셨으니 원격에 TCP를 사용한다고 가정합니다. 왜냐하면 HTTP를 통한 경우 (TCP 네트워크 포트) 서버에 연결하지 못하면 WebException이 발생하기 때문입니다.서버가 지정된 TCP 포트에 채널을 등록하기 위해 응용 프로그램을 시작하지 않은 경우 SocketException이 발생합니다.결국, 서버는 해당 포트를 수신/응답하지 않습니다. 클라이언트가 어떻게 소켓 연결을 만들 수 있습니까?

그러나 RemotingException이 발생하면 필요합니다. ~ 아니다 반드시 서버에 적절한 Remoting 응용 프로그램이 제대로 실행되고 있음을 의미합니다.포트 80(IIS)과 같은 잘못된 포트에서 잘못된 URI에 연결하여 테스트할 수 있습니다.

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

클라이언트가 포트 80에 TCP 연결을 설정할 수 있지만 Remoting 앱이 아닌 호출에 응답하는 IIS이기 때문에 RemotingException이 발생합니다.IIS는 원격 호출을 직접 처리할 수 없습니다.하지만 RemotingException은 클라이언트 측의 문제를 의미할 수도 있습니다.이 블로그 기사는 이해하는 데 도움이 될 수 있습니다.

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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top