WebSocket是一种网络通信协议,提供了在单个TCP连接上进行全双工通信的能力。它使得客户端和服务器之间的数据交换变得更加实时和高效。本文将介绍如何在WCF服务中使用WebSocket协议,并编写客户端应用。同时,将展示如何通过JavaScript在网页中与WCF WebSocket服务进行通信。
在服务器端启用WebSocket,请参考相关文档。
在WCF4.5中,netHttpBinding
和netHttpsBinding
已经被重新实现以支持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
方法中,只是显示从服务器接收到的消息。
通过使用netHttpBinding
和netHttpsBinding
,所有在WCFWebSocket连接中传输的数据都是SOAP格式(二进制或文本)。要使用JavaScript代码在网页中与WCF WebSocket服务进行通信,需要自己解析SOAP。
为了避免SOAP,需要创建并使用自定义绑定:
XML <bindings> <customBinding> <binding name="textWSHttpBinding"> <byteStreamMessageEncoding/> <httpTransport> <webSocketSettings transportUsage="Always" createNotificationOnConnection="true"/> </httpTransport> </binding> </customBinding> </bindings>