У меня есть этот самообслуживаемый код службы WebSocket WCF:
Main:
//Create a URI to serve as the base address
Uri httpUrl = new Uri("http://192.168.1.95:8080/service");
//Create ServiceHost
ServiceHost host = new ServiceHost(typeof(WebSocketService), httpUrl);
//Add a service endpoint
host.AddServiceEndpoint(typeof(IWebSocket), new NetHttpBinding(), "");
//Enable metadata exchange
ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
smb.HttpGetEnabled = true;
host.Description.Behaviors.Add(smb);
//Start the Service
host.Open();
Console.WriteLine("Service is host at " + DateTime.Now.ToString());
Console.WriteLine("Host is running... Press <Enter> key to stop");
Console.ReadLine();
Интерфейс:
namespace IWebSocketHostTest
{
[ServiceContract]
interface IWebSocketCallBack
{
[OperationContract(IsOneWay = true)]
void Send(int num);
}
[ServiceContract(CallbackContract = typeof(IWebSocketCallBack))]
public interface IWebSocket
{
[OperationContract]
void StartSend();
}
}
Услуги:
namespace IWebSocketHostTest
{
class WebSocketService : IWebSocket
{
Timer timer = null;
List<IWebSocketCallBack> callbackClientList = null;
public WebSocketService()
{
callbackClientList = new List<IWebSocketCallBack>();
timer = new Timer(3000);
timer.Elapsed += new ElapsedEventHandler(sendNumber);
timer.Start();
}
public void StartSend()
{
sender.addClient(OperationContext.Current.GetCallbackChannel<IWebSocketCallBack>());
}
private void sendNumber(Object o, ElapsedEventArgs eea)
{
timer.Stop();
var random = new Random();
int randomNum = random.Next(100);
foreach (IWebSocketCallBack callback in callbackClientList)
{
callback.Send(randomNum);
}
timer.Interval = random.Next(1000, 10000);
timer.Start();
}
}
}
Это отлично работает, если я добавлю ссылку этой службы в другое приложение .NET. Но мне нужно использовать эту службу из приложения HTML + Javascript, и я действительно потерял в том, как это сделать. Я не мог найти хороший пример или учебник с клиентом Javascript, использующим самообслуживаемую службу WCF WebSocket. Весь код Javascript WebSocket, который я мог найти, кажется очень простым, но я не мог заставить его работать.
Вот мой короткий клиентский тест JavaScript:
var ws = new WebSocket("ws://192.168.1.95:8080/service");
ws.onopen = function () {
console.log("WEBSOCKET CONNECTED");
};
он возвращает "Ошибка WebSocket: неправильный ответ HTTP. Код состояния 400," Плохой запрос ", проверяющий его с помощью Fiddler.
Что мне не хватает? Не могли бы вы дать мне некоторые ссылки на doc, чтобы получить дополнительную информацию или пример кода?
Спасибо!
EDIT:
Теперь я попытался использовать библиотеку Microsoft.ServiceModel.WebSocket, чтобы попытаться заставить ее работать.
Но, во-первых, я не знаю, поддерживается ли она Microsoft по-прежнему, или если она устарела, потому что я не мог найти какую-либо информацию в MSDN и информации в Интернете мало. Во-вторых, метод Open() класса "WebSocketHost" не найден, поэтому я не знаю, как заставить сервер работать...
Вот мой код, я взял его из вопроса на форуме ASP.NET.
using System;
using Microsoft.ServiceModel.WebSockets;
namespace WebSocketTest
{
class Program
{
static void Main(string[] args)
{
var host = new WebSocketHost<EchoService>(new Uri("ws://localhost:8080/echo"));
host.AddWebSocketEndpoint();
host.Open();
Console.Read();
host.Close();
}
}
class EchoService : WebSocketService
{
public override void OnOpen()
{
base.OnOpen();
Console.WriteLine("WebSocket opened.");
}
public override void OnMessage(string message)
{
Console.WriteLine("Echoing to client:");
Console.WriteLine(message);
this.Send(message);
}
protected override void OnClose()
{
base.OnClose();
Console.WriteLine("WebSocket closed.");
}
protected override void OnError()
{
base.OnError();
Console.WriteLine("WebSocket error occured.");
}
}
}
Но, как я уже говорил, метод "host.Open()" не найден, поэтому я не знаю, не пропал ли я какая-то ссылка или что, потому что я не мог найти информацию о классе WebSocketHost... Любая помощь?