Introduction
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
a WebSocket service,
and also gives a solution to use the JavaScript WebSocket API to call a 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.
Background
Microsoft.WebSockets.dll was initially released to wrap .NET WebSocket
APIs and to help people easily use them. The wrapper makes the communication
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 click Manage NuGet Packages. Then you could search and download the Microsoft.WebSockets package as the following picture indicates:
For more information, please refer to https://nuget.org/packages/Microsoft.WebSockets/0.2.3.
Preparation
To enable WebSocket on the server side, please refer to Part 1.
Host in ASP.NET
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 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.
Host as WCF Service
WebSocketHost
is used to host a 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;
}
}
EchoWSService
is inherited from 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 a RouteTable
'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:
<system.serviceModel>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
</system.serviceModel>
The client-side code is almost the same as Part 2 except the URL.
Summary
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.
Related Links
Using WebSocket in .NET 4.5: