2013-05-25 3 views
0

В моем приложении ASP.NET MVC пользователь нажимает кнопку в пользовательском интерфейсе для совершения телефонного звонка. Запрос ajax отправляется в приложение MVC, которое вызывает телефонный дозвон - метод в библиотеке, который вызывает внешний компонент для совершения вызова.ASP.NET MVC - распространить событие на стороне сервера на клиента

Если набранный вызов завершен получателем вызова, компонент набора номера телефона вызывает событие, вызывая обработчик событий в своем классе.

Я хочу распространять это событие на стороне клиента, чтобы он мог обновлять свой интерфейс.

одним из вариантов я не могу использовать

Я посмотрел на JavaScript сервера посланных событиях. Тем не менее, они отличаются от моей ситуации тем, что в событии, отправленном сервером JavaScript, вот что происходит:

1) Клиент инициирует соединение с новым сокетом на сервере. Ключевое различие заключается в том, что клиент инициирует соединение.

2) Соединение проводится в реальном времени и активно, пока сервер или клиент не захотят его прекратить.

3) Сервер должен быть активным на протяжении всего времени с момента установления соединения до тех пор, пока клиент или сервер не захотят прекратить соединение и не будут обмениваться уведомлениями. Это означает, что для каждого клиента используется новое соединение сокетов и, следовательно, новый рабочий поток для обслуживания обмена уведомлениями.

Если я использую события, отправленные сервером, мне придется создать сервер, который останется в живых. Это означает, что мне придется иметь новое действие над контроллером и соответствующее представление, которое вызывается в самом начале и остается в живых до тех пор, пока не будет получено уведомление об отклонении вызова.

Это может быть не только дорогостоящим, но и контр-интуитивным для моего дизайна, поскольку я не хочу, чтобы меня переадресовывали на новый вид, чтобы прослушивать события.

У кого-нибудь есть альтернатива?

+0

Знаете ли вы о 'WebSocket', верно? Чтобы интегрироваться с ASP.NET, вы можете использовать SignalR – Ian

+0

Спасибо. Да. Я полагаю, что объект 'EventSource' JavaScript, который делает события, отправленные сервером, использует' WebSockets'. Я снова посмотрю на это. Благодарю. –

+0

Вам не нужен отдельный просмотр; просто [метод контроллера, который ничего не возвращает и записывает непосредственно в объект «Response»] (http://stackoverflow.com/a/35678190/111794). –

ответ

1

Вы должны либо использовать WebSocket, либо Long polling. Для этого требуется настроить соединение с клиентом на сервер, дополнительное для обычного HTTP-цикла. И что еще вы ожидали бы? Когда страница отправляется, связь между клиентом и сервером выполняется. Цикл HTTP завершен, больше данных нельзя проплыть. Новое соединение нуждается в, чтобы исходить от клиента, потому что клиент не разрешает произвольные входящие соединения.

1

Я не думаю, что в нормальном случае есть другие альтернативы.

SignalR, и т. Д., Все требуют подключения, чтобы быть живым или периодически перезапускаться клиентом. Я не знаю ничего, что позволяет серверу инициировать соединение с браузером (это даже не представляется технически возможным из-за прокси/брандмауэров и т. Д.).

+0

Спасибо, Андрей. Я понимаю, что серверы не могут инициировать TCP-соединения с клиентами.Это невозможно, потому что клиенты не могут гарантировать статические IP-адреса, а иногда просто невозможно получить IP-адрес клиента. И это классическая проблема, с которой я боролся годами. Я не отдаленно предполагал, что это проблема. Я хотел сказать, что клиенту будет дорого поддерживать дополнительное TCP-соединение и вызвать другое действие, чтобы открыть соединение и заставить его лежать до уведомления. –

Смежные вопросы