Существует сотни способов сделать это. Одна из них - простая очередь сообщений, такая как RabbitMQ, ZeroMQ, MQSeries и т. Д.
Когда серверу нужно сообщить клиенту, что он помещает сообщение в очередь, очередь сообщений информирует клиента и доставляет сообщение клиент может действовать на него. Если вам нужен два пути, вы просто повторяете процесс, но в другой очереди. (или с другой темой, если вам нужна только одна очередь).
Что касается полезной нагрузки, ваши данные могут быть любыми, как вам нравится. Лично я создаю объект. Сериализуем его в JSON и передаем JSON. Клиент будет десериализоваться и теперь имеет полный объект для работы. Таким образом, вы можете добавить дополнительные свойства к объекту по мере необходимости в будущем.
Также вы можете написать TCP-сервер на стороне сервера и TCPClient на стороне клиента для прямой связи.
Или вы можете использовать WCF на клиенте и сервере.
Множество способов сделать это, все с собственными преимуществами и недостатками, поэтому я буду исследовать их и выбрать лучший для ваших нужд.