2016-03-11 8 views
0

Я пытаюсь установить .Net удаленный вызов в приложение thirdparty. Вот пример кода, я был дан для связи (с фирменными названиями удалены):Удаленный вызов никогда не возвращается. Возможно, удаленный конфликт?

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 

Звонок возвращается только в том случае, если я закрываю приложение Thirdparty.

Я проверил netstat -bano и единственное приложение, работающее на порту 9090, является тем, к которому я пытаюсь подключиться.

Итак, я перевел вызов в первые несколько строк функции Main() в мое приложение, и он работает нормально. Проблема в том, что это не то место, где это должно быть.

Мое приложение содержит множество других удаленных вызовов на другой сервер (не на порт 9090), а также службу WCF. Я предполагаю, что одна из этих вещей мешает.

Любые идеи о том, как я могу понять, почему этот удаленный вызов никогда не возвращается?

Update: я определил, что SocketException, вероятно, отвлекающим маневром, поскольку эти исключения возникают, когда он работает в 3-й тест участник приложения. Кроме того, похоже, что причина его висит в том, что она ждет Socket.Read(), которая никогда не получает никаких данных.

ответ

0

Оказывается, в удаленном режиме .NET может быть только один TCPClientChannel для AppDomain. Activator.GetObject() использует первый зарегистрированный канал.

Причина, по которой это было блокирование, заключается в том, что у меня уже была настройка TCPClientChannel в приложении AppDomain. Этот канал имел безопасный набор в false, когда он был зарегистрирован. т.е.

ChannelServices.RegisterChannel(_channel, false); 

Служба Я пытался поговорить с позволили безопасности и, следовательно, вызов удаленного доступа будет висеть пытается слушать ответ, что никогда бы не пришел.

Решение состоит в том, чтобы загрузить мою интеграцию в новый AppDomain, чтобы я мог настроить TCPChannel по-разному.