Реализация передачи данных по websocket выполнена при помощи библиотеки https://socket.io.
Примечание: символ ~/ будет означать корневой адрес
Шаг 1. Подключение библиотеки socket.io
<script src="~/socket.io/socket.io.js"></script>
Шаг 2. Инициализация соединения
var socket = io.connect('http://domain.com', {
    path: '/virtaulPath' + '/socket.io',
    transports: ['websocket']
});
, где
- http://domain.com — корневой адрес сервиса
 - ‘/virtualPath’ — виртуальная директория, если есть, иначе String.Empty
 
Шаг 3. Регистрация пользователя на сервере.
Данный шаг требуется для последующей идентификации пользователя. Суть этого шага состоит в том, что нужно вызвать любой запрос на сервере, например получение текущего серверного времени.
socket.emit('rpc', {
    namespace: 'PN',
    action: 'shell',
    method: 'getServerTime',
    data: null,
    token: 'текущий токен авторизации' // он и нужен нам
});
, где:
- namespace: string — пространство имен, где хранятся удаленные процедуры. По умолчанию PN
 - action: string — имя области (действия)
 - method: string — имя метода
 - data: any — данные для обработки на сервере. Список элементов уточнять у разработчика методов.
 - token: string — токен авторизации. Его следует передавать каждый раз при выполнении запроса.
 
Примечание: полный перечень методов можно получить вызвав запрос GET ~/rpc/meta, который доступен авторизованным пользователям.
Далее подписываемся на событие ответа от сервера.
socket.on('PN.shell.getServerTime', function(obj) { // (1)
    if(obj.code == 200) {
        // (2) Регистрация прошла успешно    
    }
});
Имя события (1) на которое надо подписываться именуется из сложения строк.
var eventName = namespace + '.' + action + '.' + method;
Результатом ответа будет объект (2), который имеет следующую структуру:
- meta: any — мета информация socket запроса
- processed: boolean — если true, то значит операция завершена полностью, иначе требуется дожидаться следующего ответа.
 - status: string — строка со статусом выполнения операции
 
 
socket.io(evantName, function(obj) {
    if(obj.meta.processed == false) {
        // тут может отображаться статус выполнения операции
        console.log(obj.meta.status);
    } else {
        // значит операция была завершена
    }
});
- data: any — содержит мету информацию выполнения RPC запроса
- success: boolean — результат выполнения RPC — запроса
 - msg: string — текст сообщения
 
 - result: any — результат выполнения запроса
 - code: number — код выполнения
- 200 — запрос выполнено удачно
 - 401 — не авторизован
 - 500 — ошибка выполнения
 
 
Шаг 4. Тестирование уведомлений
Подписываемся на соответствующее событие:
socket.on('notifiction', function(obj) {
    if(obj.meta.processed == true) {
        console.log(obj.result.title);
        console.log(obj.result.message);
    }
});
Для тестирования механизма уведомлений есть тестовый адрес:
GET ~/notification/test?username=[user]&message=[message];
, где:
- username: string — логин пользователя
 - message: string — текст сообщения
 
В результате вызова запроса, обработчик должен его перехватить и вывести результат в консоли.