2011-03-01 38 views
3

我正在調用使用InvokeMember方法的WCF方法.WCF方法將一個整數和一個out對象作爲參數。這是在WCF服務的代碼:Reflection和WCF

public int SimpleTest(int n, out object OBJ) 
    { 
     OBJ = new Int32(); 
     OBJ = 12; 
     return n; 
    } 

當我使用InvokeMember調用函數用參數new Object[]{1 , obj},物鏡12變爲如預期。
但是當內部SimpleTest的OBJ設置爲一個複雜的對象(OBJ = new MyClass())我得到的頁面上出現以下異常調用的方法:Exception has been thrown by the target of an invocation.
的內部異常指出The underlying connection was closed: The connection was closed unexpectedly.

我不明白爲什麼這個出現異常。有人可以解釋嗎?

回答

1

MyClass的構造函數是做什麼的? MyClass有沒有一個靜態構造函數?

Exception has been thrown by the target of an invocation.例如,可以通過一個類的靜態構造函數中的異常引發,所以似乎MyClass的靜態構造函數試圖連接到某些東西(如數據庫),但由於連接已經關閉。

請記住,在啓動程序時,但在創建MyClass的第一個實例之前,不會運行靜態構造函數。

+1

這也可以是* regular *構造函數,而不僅僅是靜態ctor;包裝的異常只是由於InvokeMember – 2011-03-01 08:27:06

+0

正如我的回答中提到的第一行:)。但我很確定其中一名建築師是這裏的罪魁禍首。 – 2011-03-01 08:28:04

+0

MyClass是一個EntityObject ... – scatman 2011-03-01 09:16:26

0

在服務器上配置WCF跟蹤會告訴你到底發生了什麼問題。

我想你會發現服務端通道堆棧正在拋出一個異常,因爲它試圖將out參數序列化爲響應消息併發送回客戶端。這會使服務端通道發生故障,並且您在客戶端看到的異常是客戶端視圖,由服務發起的由此造成的連接斷開連接。

序列化時出現異常的原因是,您的數據合同告訴操作格式化程序希望使用vanilla object,但是您的方法正在輸出EntityObject。如果要支持基本簡單類型以外的輸出參數值,則需要通過使用KnownTypeAttribute或通過在服務通道堆棧中的代碼中顯式管道來爲格式化程序提供有關可能需要序列化的具體類型的更多信息。