2016-03-11 79 views
0

我正在嘗試爲第三方應用程序建立.Net遠程調用。這裏的(除去專有名稱)示例代碼中我一直在考慮該連接:遠程處理調用永不返回。可能遠程衝突?

IDictionary props = new ListDictionary(); 
props["port"] = 0; // have the Remoting system pick a unique listening port (required for callbacks) 
props["name"] = string.Empty; // have the Remoting system pick a unique name 
BinaryServerFormatterSinkProvider serverProv = new BinaryServerFormatterSinkProvider(); 
serverProv.TypeFilterLevel = System.Runtime.Serialization.Formatters.TypeFilterLevel.Full; 
_channel = new TcpChannel(props, new BinaryClientFormatterSinkProvider(), serverProv); 
ChannelServices.RegisterChannel(_channel, true); 

IThirdparty _thirdparty = (IThirdparty)Activator.GetObject(typeof(IThirdparty), "tcp://localhost:9090/Thirdparty.AppIntegration"); 

//Example API call 
_thirdparty.Minimized = !_thirdparty.Minimized; 

當該代碼被通常稱爲,它掛在_thirdparty.Minimized和輸出SocketException與消息的診斷窗口:

No connection could be made because the target machine actively refused it 

如果我關閉第三方應用程序,該調用只會返回。

我檢查了netstat -bano並且在端口9090上運行的唯一應用程序是我試圖連接的應用程序。

所以我把電話轉到Main()函數的前幾行,在我的應用程序中,它工作得很好。問題是,這不是它應該在的地方。

我的應用程序包含很多其他遠程調用到另一臺服務器(不在端口9090)以及WCF服務。我的猜測是這些事情之一是干涉。

關於如何找出爲什麼這個遠程調用永不返回的任何想法?

更新: 我已經確定SocketException可能是一個紅色的鯡魚當它工作在第三方測試程序這些異常被創建。另外,它看起來像懸掛的原因是因爲它正在等待一個永遠不會獲取任何數據的Socket.Read()。

回答

0

事實證明,在.NET遠程處理中,每個AppDomain只能有一個TCPClientChannel。 Activator.GetObject()使用已註冊的第一個通道。

這是阻塞的原因是我的AppDomain中已經有一個TCPClientChannel設置。該頻道在註冊時已將其安全設置爲false。即

ChannelServices.RegisterChannel(_channel, false); 

我試圖與之交談的服務啓用了安全性,因此遠程調用會掛起,試圖收聽永遠不會到來的響應。

解決方案是將我的集成加載到一個新的AppDomain中,以便我可以以不同方式配置TCPChannel。

相關問題