【发布时间】:2014-08-06 01:22:48
【问题描述】:
我有这个 WCF 自托管 WebSocket 服务代码:
主要:
//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 应用程序中使用此服务,而我真的迷失了如何做到这一点。我找不到使用自托管 WCF WebSocket 服务的 Javascript 客户端的良好示例或教程。 我能找到的所有 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 对其进行测试。
我错过了什么?您能否给我一些文档链接以获取更多信息或代码示例?
谢谢!
编辑:
现在我尝试使用“Microsoft.ServiceModel.WebSocket”库尝试使其工作。
但是,首先,我不知道它是否仍由 Microsoft 维护,或者它是否已被弃用,因为我在 MSDN 上找不到任何信息,而且互联网上的信息也很少。 其次,没有找到“WebSocketHost”类的“Open()”方法,所以我不知道如何让服务器运行......
这是我的代码,我取自 ASP.NET 论坛上的 question。
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 类的信息...有什么帮助吗?
【问题讨论】:
-
请问您为什么要将 WCF 用于 WebSocket 服务器?只是好奇... :)
-
因为我的想法是当客户端和服务器在同一台机器时使用命名管道进行内部通信,当客户端在外面时使用websockets(需要全双工),但如果有更好的选择,我正在听。顺便说一句,我想到了 SignalR,但我没有时间阅读足够多的文档,而且我还没有进行任何测试。
-
您使用的是哪个操作系统?
-
Windows 8.1 感谢上面的链接,这对我来说是一个很好的例子,但问题是在我的 Microsoft.ServiceModel.WebSockets(0.2.3 版本)库中没有“Open( )" 用于“WebSocketHost”的方法;所以这个例子变得毫无用处......
标签: c# javascript wcf websocket self-hosting