#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!