Похоже, трудно достичь решения.
У меня установлено основное приложение
(ServerApp) на сервере локальной сети (который
за брандмауэром, поэтому сервер может
доступ в интернет, но это не может быть
доступ из интернета напрямую (нет
статический IP))
Исходя из этого, должно быть ясно, что на сервере не может размещаться служба, поскольку вы не сможете получить к ней доступ из-за пределов локальной сети. Поэтому, если ваше ServerApp не подключится к службе, размещенной в MonitorApp, или не настроена переадресация портов на брандмауэре, достичь этого не удастся.
Для меня правильный дизайн состоит в том, что ServiceApp размещает службу, которая может предоставлять данные мониторинга, и вторую службу для выдачи команд. В вашем сценарии это невозможно. Частично решить проблему мониторинга можно с помощью услуги хостинга в MonitorApp:
Вы можете выставить договор на обслуживание как
[ServiceContract]
public interface MonitoringAppContract
{
[OperationContract(IsOneWay=true)]
void SendMonitoringData(MonitoringData data);
}
ServerApp будет регулярно вызывать эту операцию и передавать данные мониторинга в MonitorApp. Из-за одностороннего вызова он не будет заблокирован обработкой данных в MonitorApp, но он также не будет уведомлен об исключениях. Проблема здесь в том, что служба WCF, предоставляемая в MonitorApp, должна быть доступна, или ServerApp будет ожидать истечения времени ожидания Open.
Дуплексная связь также не будет решением, потому что снова ServerApp придется установить соединение - опять же проблемы с тайм-аутами, более того, дуплексная связь является сессионной, и она требует другой заботы о таймаутах неактивности и т. Д.
Ваша проблема может быть легко решена с помощью ретранслятора, предоставляемого службами Azure, но вы должны заплатить за это.