我檢查了其餘的遠程處理問題,這個具體的案例似乎沒有解決。.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