WebSocket协议与.NET WebSocket支持

WebSocket是一种网络通信协议,提供了在单个TCP连接上进行全双工通信的能力。它使得客户端和服务器之间的数据交换变得更加实时和高效。本文将介绍如何在WCF服务中使用WebSocket协议,并编写客户端应用。同时,将展示如何通过JavaScript在网页中与WCF WebSocket服务进行通信。

准备工作

在服务器端启用WebSocket,请参考相关文档。

托管服务

WCF4.5中,netHttpBindingnetHttpsBinding已经被重新实现以支持WebSocket。要使WCF服务通过WebSocket为客户端提供服务,需要在服务接口声明中为ServiceContract属性设置CallbackContract。例如:

C# [ServiceContract(CallbackContract = typeof(IWSChatCallback))] public interface IWSChatService { [OperationContract(IsOneWay = true)] Task SendMessageToServer(string msg); }

客户端将调用SendMessageToServer方法,并将用户发送的消息作为参数。因此,服务器需要实现这个方法来处理从客户端接收到的消息。

服务端实现

可以简单地将IWSChatService实现为一个回声服务器:

C# public class WSChatService : IWSChatService { public async Task SendMessageToServer(string msg) { var callback = OperationContext.Current.GetCallbackChannel(); if (((IChannel)callback).State == CommunicationState.Opened) { await callback.SendMessageToClient(string.Format("Got message {0} at {1}", msg, DateTime.Now.ToLongTimeString())); } } }

服务只是装饰从客户端接收到的消息,并调用SendMessageToClient将装饰后的消息发送回客户端。

客户端应用

编写WCF客户端应用时,创建了一个控制台应用程序,并将之前的WCF服务添加到服务引用中。然后,在客户端实现了之前在服务器上声明的IWSChatServiceCallback接口:

C# internal class CallbackClient : IWSChatServiceCallback { public void SendMessageToClient(string msg) { Console.WriteLine(msg); } }

SendMessageToClient方法中,只是显示从服务器接收到的消息。

JavaScript在网页中的应用

通过使用netHttpBindingnetHttpsBinding,所有在WCFWebSocket连接中传输的数据都是SOAP格式(二进制或文本)。要使用JavaScript代码在网页中与WCF WebSocket服务进行通信,需要自己解析SOAP。

为了避免SOAP,需要创建并使用自定义绑定:

XML <bindings> <customBinding> <binding name="textWSHttpBinding"> <byteStreamMessageEncoding/> <httpTransport> <webSocketSettings transportUsage="Always" createNotificationOnConnection="true"/> </httpTransport> </binding> </customBinding> </bindings>
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485