.NET远程处理异常

.NET远程处理异常,.net,remoting,.net,Remoting,这与引发.NET远程处理异常有关。如果您查看MSDN,它会提到当远程处理出现问题时会引发远程处理异常。如果我的服务器没有运行,我会得到一个套接字异常,这很好 我想弄清楚的是:获取远程处理异常是否确实表明我的服务器已启动并正在运行?如果是,这将解决问题。如果不是:是否有办法确定远程处理异常是起源于客户端还是服务器端 更新: 我试图解决的问题是,服务器最初关闭,然后客户端向服务器发送一些消息。现在我得到一个套接字异常,说“无法建立连接…”,这很好 有一个线程正在定期向服务器发送消息,以查看服务器是否

这与引发.NET远程处理异常有关。如果您查看MSDN,它会提到当远程处理出现问题时会引发远程处理异常。如果我的服务器没有运行,我会得到一个套接字异常,这很好

我想弄清楚的是:获取远程处理异常是否确实表明我的服务器已启动并正在运行?如果是,这将解决问题。如果不是:是否有办法确定远程处理异常是起源于客户端还是服务器端

更新: 我试图解决的问题是,服务器最初关闭,然后客户端向服务器发送一些消息。现在我得到一个套接字异常,说“无法建立连接…”,这很好

有一个线程正在定期向服务器发送消息,以查看服务器是否可用。现在,服务器出现了,在这一点上,您可以得到响应,这很好,或者您可以得到一些异常,很可能是远程异常。所以,我想问的是:如果我没有收到消息,我收到一个远程异常,服务器是否有可能启动并运行,而我仍然收到这个异常


我所做的只是调用远程对象上的一个方法,该方法不执行任何操作,但返回。如果没有例外,那我就好了。现在,如果存在远程处理异常,并且我知道远程处理异常发生在服务器上,那么我知道尽管收到了异常,但我已连接到服务器。

请尝试确保您发送的消息正确,服务器接收的消息也正确,例如使用断言(称为契约设计)。
如果有这种可能性,请尝试同时调试服务器端和客户端。(同时运行两个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
=====

它应该告诉您源位于服务器上,带有服务器端堆栈跟踪。

如果您打算使用自定义异常类型在远程处理边界上抛出,请确保将这些类型标记为“[Serializable]”。我记不起确切的错误信息,但在我第一次看到它的时候,它让我困惑了一大半天


另外,作为提示,TargetInvocationException通常在其InnerException属性中嵌入了真正的异常。没有什么比“异常是由调用的目标引发的”更无用的了。

好吧,既然您这么说了,我假设您正在使用TCP进行远程处理,因为如果是通过HTTP,那么在连接(TCP网络端口)服务器失败时,将引发WebException。当服务器没有启动应用程序在指定的TCP端口上注册通道时,您将得到一个SocketException。毕竟,服务器没有侦听/响应该端口,客户机如何进行套接字连接

但是,如果出现远程处理异常,则不一定意味着服务器的远程处理应用程序运行正常。您可以通过连接到错误端口上的错误URI进行测试,例如端口80(IIS)

这将导致远程处理异常,因为虽然客户端可以与端口80建立TCP连接,但响应调用的是IIS,而不是远程处理应用程序;IIS无法直接处理远程处理调用。话虽如此,RemotingException也可能意味着客户端出现问题。这篇博客文章可能会帮助你更好地理解


也许你应该重新命名这个问题。是的,告诉我一些异常类型名称还没有这样说的事情。问题是,如果远程对象上的方法成功,那么就没有问题了。我想没有必要为此抛出异常。请看我的另一篇(稍后)文章。假设端口上除了远程处理服务器之外没有其他任何东西在运行,我仍然认为远程处理异常可能并不表示服务器正在运行并准备好处理请求。我说得对吗?这就是为什么我在想是否有办法确定服务器上是否发生异常
IMyRemoteObject obj = (IMyRemoteObject) Activator.GetObject(
    typeof(IMyRemoteObject),
    "tcp://localhost:80/MyRemoteObject.rem");