我检查了其余的远程处理问题,这个具体的案例似乎没有解决。.NET远程处理异常没有处理客户端
我有一个.NET Remoting服务器/客户端设置。在服务器端,我有一个可以抛出异常的方法的对象,以及将尝试调用该方法的客户端。
服务器:
public bool MyEquals(Guid myGuid, string a, string b)
{
if (CheckAuthentication(myGuid))
{
logger.Debug("Request for \"" + a + "\".Equals(\"" + b + "\")");
return a.Equals(b);
}
else
{
throw new AuthenticationException(UserRegistryService.USER_NOT_REGISTERED_EXCEPTION_TEXT);
}
}
客户:
try
{
bool result = RemotedObject.MyEquals(myGuid, "cat", "dog");
}
catch (Services.Exceptions.AuthenticationException e)
{
Console.WriteLine("You do not have permission to execute that action");
}
当我打电话使用GUID导致CheckAuthentication返回false MyEquals,.NET试图抛出异常,并说是的AuthenticationException未处理。这发生在服务器端。这个例外永远不会被整理到客户端,我不知道为什么。我所看到的所有问题都解决了客户端处理异常的问题,但它不是自定义异常,而是基本类型。就我而言,我甚至无法将任何例外都通过远程边界传递给客户。这是一个AuthenticationException的副本。它位于服务器和客户端之间的共享库中。
[Serializable]
public class AuthenticationException : ApplicationException, ISerializable
{
public AuthenticationException(string message)
: base(message)
{
}
public AuthenticationException(SerializationInfo info, StreamingContext context)
: base(info, context)
{
}
#region ISerializable Members
void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
{
base.GetObjectData(info, context);
}
#endregion
}
啊,是的。这里是FxCop的消息: 警告:CA1058:Microsoft.Design:更改'AuthenticationException'的基本类型,以便它不再扩展'ApplicationException'。此基本异常类型不为框架类提供任何附加值。改为扩展'System.Exception'或一个现有的未密封的异常类型。除非在为整个异常类创建捕获处理程序方面有特定的值,否则不要创建新的异常基类型。 – 2009-09-30 17:08:54
啊。对不起。复制我的课程时,我忘了包含该行。我用[Serializable]装饰我的异常。 – 2009-09-30 17:59:16
我正在阅读你对Joe的评论,没有在客户端捕获异常。我一起提供了一个快速的Remoting服务器和客户端工具,它每次都会被客户端捕获,而不是在服务器上。我会问一些更多的资格问题,希望能够指导我们解决这个谜团。 #1:持有MyEquals的类是否来自MarshalByRefObject?如果没有,应该这样才能正确地对Remoting进行编组。 #2:你如何托管服务器? IIS,一个Windows服务或只是一个独立的应用程序来测试? – 2009-09-30 18:57:53