Проблема с черновиком WebSockets

#c# #jquery #websocket

#c# #jquery #websocket

Вопрос:

У меня возникли некоторые проблемы с веб-сокетами и реализацией проекта Microsoft. Я использую API, предоставленный ими для обратной связи с сервером, а также исправление Silverlight для браузеров, которые изначально не поддерживают веб-сокеты. Информация, над которой я работаю, поступает из http://channel9.msdn.com/Events/MIX/MIX11/HTM10 и http://html5labs.interoperabilitybridges.com/prototypes/websockets/websockets/info Мой код компилируется нормально, он начинает открывать соединение, затем завершается сбоем. Вот мой код внутреннего сервера (в консольном приложении C #)

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.ServiceModel.WebSockets;
namespace ChatBackend
{
    class Program
    {
        static void Main(string[] args)
        {
            var host = new WebSocketsHost<MessageHandler>();
            host.AddWebSocketsEndpoint("ws://localhost:4502/MessageHandler");
            host.Open();
            Console.ReadLine();
        }
    }

}
  

Вот класс MessageHandler:

  class MessageHandler : WebSocketsService
{
    public override void OnMessage(string value)
    {
        string returnMessage = "You just said '"   value   "'";
        Console.WriteLine(value);
        SendMessage(returnMessage);
    }
}
  

Эта серверная часть, похоже, работает нормально. Вот клиентская часть:

  $(document).ready(function () {
            setTimeout(connect, 2050);
        });

        function connect() {
            websocket = new WebSocketDraft("ws://localhost:4502/MessageHandler");
            websocket.onopen = function() {
                websocket.send("test");
            };
            websocket.onclose = function () {
                alert("DIED");
            };
            websocket.onmessage = function(event) {
                sendMessage(new message(0, event.data, 0));
            };
        }
  

РЕДАКТИРОВАТЬ: я проверил свой брандмауэр и разрешил порт, который я использовал. Теперь соединение просто зависает — оно не закрывается, оно не открывается. Есть идеи?

РЕДАКТИРОВАТЬ 2: Я провел еще несколько исследований, оказывается, мне нужно удалить clientaccesspolicy.xml . Также оказывается, что у меня его никогда не было, но я возвращал пользовательское перенаправление 302 вместо 404 not found. Исправлено, но прогресса нет. Он просто зависает.

ПРАВКА 3: Пробовал отключить антивирус и брандмауэр, никаких изменений, спасибо — дайте мне знать, если мне понадобится еще код или информация здесь.

Комментарии:

1. У вас есть антивирус или пользовательский прокси, просто из интереса? Кроме того, если он у вас есть, что произойдет, если вы добавите ссылку на этот веб-сервис через Visual Studio? при попытке его обработки вы можете получить ошибку лучше…

2. @Russ На C нет пользовательского прокси, кроме fiddler — и он по-прежнему не работает, когда я выключаю fiddler. антивирус — MS Security Essentials, который не должен вмешиваться в мои порты или что-либо еще.

3. Не должно быть no, но мне интересно, знает ли он о протоколе WS: // ?

4. @Russ пытался отключить его — никаких изменений. :-

Ответ №1:

Можете ли вы использовать Firebug или что-то еще и поставить точку останова в этой строке в jquery.slws.js (предполагая, что это тот, который вы используете!)

 this.slws = slCtl.Content.services.createObject("websocket");
  

А затем пройдите и посмотрите, где происходит сбой?

Комментарии:

1. согласно видео (ссылка в исходном вопросе), создание экземпляра объекта websocket ДЕЙСТВИТЕЛЬНО открывает его. я просматриваю видео на предмет любых ошибок, которые я, возможно, допустил.

2. Когда сокет открывается, он отправляет сообщение. Я бы предположил, что создание нового websocket открывает соединение.

3. Это просто во фрагменте кода, который я видел по его ссылкам, .send вызывается вне onxxx.

4. .send используется для фактической отправки некоторых данных по потоку — это не то же самое, что их открытие. Я пытаюсь вызвать это после открытия соединения, чего, похоже, никогда не происходит.

5. да, извините за это — просто посмотрел на плагин и обновил свой ответ.

Ответ №2:

Ваш URL-адрес определенно выглядит так, как будто он соответствует настройкам на стороне вашего сервера. Действительно сложно найти какие-либо примеры фактического использования WebSockets, поскольку это все еще такая новая технология, но из того, что я смог понять из единственного рабочего примера, который я смог найти (он был на сайте html5labs), я думаю, возможно, вы пытаетесь выполнить запись в сокет до того, как он закончит открываться. В примере, который я нашел, выглядело так, как будто они проверяют свойство readyState сокета и пытаются сделать это только send , если readyState === 1. Сокет в этом примере открывается путем привязки к $(document).ready событию, а отправка вызывается нажатием кнопки.

Комментарии:

1. Спасибо, Джоэл — но, похоже, это не работает — onclose вызывается перед onopen, и моя попытка отправить данные находится внутри onopen. Кроме того, видео (в вопросе выше), за которым я следил, также не использовало это свойство readyState… вот что действительно странно. я довел видео до совершенства.

Ответ №3:

Наконец-то это заработало! Оказывается, мне пришлось добавить clientaccesspolicy.xml в корневую папку веб-сайта по умолчанию на моем сервере. Я думал, что должен был удалить это — я неправильно прочитал некоторую информацию и быстро забыл об этом. Мораль истории: прочитайте readme!