Part 1 gives an overview of the WebSocket protocol and .NET WebSocket support. Part 2 demonstrates how to use WebSocket in traditional ASP.NET and MVC 4 web applications. Part 3 demonstrates how to use WCF to host and communicate with WebSocket service, and also gives a solution to use JavaScript WebSocket API to call WebSocket WCF service.
Other than the solutions above, Microsoft has released a utility assembly which helps to use .NET server-side WebSocket APIs like using the event-based JavaScript WebSocket APIs. I will briefly introduce how to use it in this article.
MSWSChat.zip is the sample to host in ASP.NET.
MSWcfWSChat.zip is the sample to host as a WCF Service.
Microsoft.WebSockets.dll was initially released to wrap .NET WebSocket APIs and to help people easily use them. The wrapper makes the communication to event-based. It supports both binary (byte[]) and text messages. Note that the namespace is Microsoft.Web.WebSockets. It is a bit different from the assembly name.
You could download it through NuGet within Visual Studio 2012. Just right-click your project to open the context menu and clickManage NuGet Packages. Then you could search and download theMicrosoft.WebSockets package as the following picture indicates:
For more information, please refer to https://nuget.org/packages/Microsoft.WebSockets/0.2.3.
To enable WebSocket on the server side, please refer to Part 1.
To host a WebSocket server in ASP.NET, I first write a class inherited from WebSocketHandler
:
public class MyWSHandler : WebSocketHandler
{
public override void OnOpen()
{
this.Send("Welcom from " + this.WebSocketContext.UserHostAddress);
}
public override void OnMessage(string message)
{
string msgBack = string.Format(
"You have sent {0} at {1}", message, DateTime.Now.ToLongTimeString());
this.Send(msgBack);
}
public override void OnClose()
{
base.OnClose();
}
public override void OnError()
{
base.OnError();
}
}
Then I use MyWSHandler
in an custom HTTP handler:
public class MSWSChatHandler : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
if (context.IsWebSocketRequest || context.IsWebSocketRequestUpgrading)
{
context.AcceptWebSocketRequest(new MyWSHandler());
}
}
public bool IsReusable
{
get
{
return false;
}
}
}
Don't forget to register the custom HTTP handler in Web.config like what I have done in Part 2.
The code is much simpler and readable than Part 2, right? And for sure, you could use the same way in MVC 4 web applications.
The client-side code is almost the same as Part 2. Please refer to the attachments.
WebSocketHost
is used to host WebSocket server as a WCF service. You could use it in both IIS and a host application. Here I want to host it in IIS, so I write a host factory -MyWebSocketServiceFactory
:
public class MyWebSocketServiceFactory : ServiceHostFactory
{
protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
{
WebSocketHost host = new WebSocketHost(serviceType, baseAddresses);
host.AddWebSocketEndpoint();
return host;
}
}
is inherited from EchoWSService
WebSocketService
. It implements the communication behaviors:
public class EchoWSService : WebSocketService
{
public override void OnOpen()
{
this.Send("Welcome!");
}
public override void OnMessage(string message)
{
string msgBack = string.Format(
"You have sent {0} at {1}", message, DateTime.Now.ToLongTimeString());
this.Send(msgBack);
}
protected override void OnClose()
{
base.OnClose();
}
protected override void OnError()
{
base.OnError();
}
}
Then I register MyWebSocketServiceFactory as aRouteTable
's entry in Global.asax:
public class Global : System.Web.HttpApplication
{
protected void Application_Start(object sender, EventArgs e)
{
RouteTable.Routes.Add(new ServiceRoute(
"Echo", new MyWebSocketServiceFactory(), typeof(EchoWSService)));
}
}
So that a request whose URL is like "ws://localhost/MSWcfWSChat/Echo
" would be treated as a WebSocket connection request.
The only thing we need to do in Web.config is to make sure aspNetCompatibilityEnabled
is set to true:
The client-side code is almost the same as Part 2 except the URL.
Microsoft.WebSockets.dll is very easy to use. However, it is not a Microsoft official release. The last update was done in June 2012. I hope it will be supported continuously in future.
Using WebSocket in .NET 4.5: