Итак... ASP.NET MVC и WebSockets?

У меня есть приложение в MVC 3, и я хочу добавить к нему WebSockets (с отступлением от Comet).

Я немного исследовал, и я узнал, что часть кометы довольно проста, и я бы скорее сделал это сам. Просто AsyncControllers и довольно простой бит js - это все, что требуется для обработки этих долгоживущих запросов ajax.

Теперь, в случае с WebSocket, все начинает пачкаться. Я просмотрел несколько библиотек, но в основном они, похоже, настраивают веб-сервер (поэтому нуждаются в другом хосте или порту) и прослушивают там запросы протокола ws. Например, для SuperWebSocket, который сначала казался приятным, но проблема с этим была "я - веб-сервер" (конечно, это нормально, но я бы предпочел избежать).

Затем я посмотрел на "PingIt" или что-то в этом роде, я не могу найти ссылку сейчас. Однако у меня есть источник на другом компьютере. Этот работает на конечной точке в mvc, но мне не совсем понравилось то, как он обрабатывает вещи, например, принимает объект IDisposable и через отражатель создает javascript-элемент, который визуализируется на клиенте, который очень загрязнен с их именем библиотеки, в котором я действительно не интересовался, плюс это чувствовало, что многие из них были брошены против того, что я мог бы пожелать, что противоречит моему мнению о том, как страница должна отображаться (особенно сейчас что я работаю над MVC, что в значительной степени означает, что я могу кодировать чистые, ненавязчивые html-страницы).

В принципе, я хочу, чтобы мои конечные точки были чем-то вроде:

domain.com/rt/comet
domain.com/rt/socket

а не

domain.com/rt/comet
domain.com:81/

Итак: возможно ли получать соединения с websocket (и выполнять квитирование и все, что должно быть сделано) на конечной точке в контроллере приложений ASP.NET asp.net, вместо того, чтобы где-то настраивать tcplistener?

Это также поможет мне сохранить код кометы немного ближе к моему коду websocket

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

Также: пожалуйста, дайте мне знать, если то, что я прошу, не работает.

Ответ 1

Просто согласимся с комментариями и предоставим несколько ссылок. SignalR - это путь.

Сайт: http://signalr.net/ и http://www.asp.net/signalr

Код: https://github.com/SignalR/SignalR

Nuget: Install-Package Microsoft.AspNet.SignalR -pre

Хорошие отправные точки:

Видео от одного из создателей: http://vimeo.com/43659069 < - [Загружает информацию!]

Ответ 2

В качестве ориентира для этой темы в WebSockets - хочу заметить, что на первый взгляд WebSockets выглядит очевидным выбором. API предназначен для обеспечения двунаправленного канала связи между браузером и сервером через один TCP-сокет. Он был стандартизирован IETF, а новейшие браузеры Chrome, Firefox, IE и Opera поддерживают WebSockets. Это разработано, чтобы минимизировать накладные расходы полосы пропускания за счет сокращения накладных расходов сообщения HTTP. Итак, что не нравится?

Как любая воспринятая серебряная пуля, вещи не всегда являются тем, чем кажутся. Существует множество проблем:

Поддержка браузеров. По состоянию на июнь 2012 года только 47,64% используемых в настоящее время браузеров фактически поддерживают WebSockets http://caniuse.com/websockets. Это означает, что независимо от того, насколько хороши WebSockets, вам все равно понадобится второе "резервное" решение для поддержки большинство интернет-пользователей. А поскольку в большинстве "резервных" решений используется Flash, вам все еще не повезло на iOS и других мобильных устройствах.

Узнайте больше о WebSockets в реальности из этого поста в блоге: Являются ли шлюз и сервер HTML5 WebSockets панацеей для передачи данных в реальном времени?

Обновление поддержки браузеров : по состоянию на май 2019 года 96,77% используемых в настоящее время браузеров фактически поддерживают WebSockets http://caniuse.com/websockets

Ответ 3

Я немного исследовал, и я узнал, что часть кометы довольно проста, и я бы скорее сделал это сам. Просто AsyncControllers и довольно простой бит js - это все, что требуется для обработки этих долгоживущих запросов ajax.

Извините, это не так просто. Различные браузеры ведут себя по-разному и лучше работают с использованием разных методов - XMLHttpRequest, XDomainRequest, объектов ActiveX, Multpart replace, Long-Polling, Streaming. Из-за этого и того факта, что для этих решений нет определенной спецификации, Комета - это просто взломать. События, отправленные сервером (EventSource API) и WebSockets были разработаны с нуля, чтобы предложить наиболее эффективный и стандартизированный способ передачи данных с сервера клиенту, и, что еще более важно, WebSockets были разработаны для двунаправленной связи между клиентом в режиме реального времени и сервер.

Теперь, в случае с WebSocket, все начинает пачкаться. Я просмотрел несколько библиотек, но в основном они, похоже, настраивают веб-сервер (поэтому нуждаются в другом хосте или порту) и прослушивают там запросы протокола ws. Это относится, например, к SuperWebSocket, который сначала казался приятным, но проблема "я являюсь веб-сервером" (это, конечно, отлично, но я бы предпочел избежать).

Windows Server 8 будет поддерживать WebSockets. До тех пор вам нужно будет использовать отдельный "веб-сервер", такой как XSockets или SuperWebSockets (о котором вы уже указали). Там также Alchemy WebSockets и Fleck.

Но поскольку Microsoft ведет SignalR вперед, скорее всего, она получит полное сцепление и даже станет частью стандартного ASP.NET MVC стек (возможно, это уже запланировано, я немного отстаю от MS). SignalR поддерживает WebSocket (или имеет модуль) и будет обрабатывать резервные копии для механизмов транспорта, которые поддерживают браузер пользователя.

Для получения дополнительной информации о самостоятельных решениях (есть еще несколько параметров .NET/IIS), проверьте эти самостоятельно размещенные службы реального времени.

Мне очень интересно видеть, как IIS масштабируется при работе с тысячами постоянных подключений - была ли она переписана для Windows Server 8? Как скоро вам нужно ввести балансировщик нагрузки и горизонтально? Если вы не беспокоитесь об этом, я бы посмотрел размещенную службу реального времени.