Websockets with ASP.net 4.5 and Visual Studio 2012

Web applications are becoming increasingly sophisticated and it is common to need to communicate with various services.

There are a number of options to accomplish this task with probably the most popular being to continually poll a server with XHR requests. Other alternatives exist that delay disconnections. These can be tricky to implement and don’t scale well (sometimes worse than polling as they keep a connection open) so aren’t used as much.

HTTP isn’t really an ideal protocol for performing frequent requests as:

  • It’s not optimized for speed
  • It utilizes a lot of bandwidth for every request with various headers etc sent with every request
  • To keep an application up to date many requests must be sent
  • Provides limited cross domain support (relying on workarounds such as JSONP http://remysharp.com/2007/10/08/what-is-jsonp/)
  • Firewalls & proxys sometimes buffer streaming/long polling solutions increasing latency
  • Long polling & streaming solutions are not very scalable

WebSockets are a new technology that attempts to resolve some of these limitations by:

  • Sending the minimum amount of data necessary
  • Making more efficient usage of bandwidth
  • Providing cross domain support
  • Still operating over HTTP so it can transverse firewalls and proxies
  • Works with some load balancers (TCP l4)
  • Provides support for binary data (note some JavaScript implementations don’t currently support this)

When would web sockets be a suitable protocol for your application?

You might want to consider using web sockets in the following scenarios:

  • Games
  • Real time data
  • Chat applications
  • News tickers

There is a nice set of demos at: http://www.html5rocks.com/en/tutorials/websockets/basics/ and an interesting article that compares a Web Sockets and polling solution in terms of latency & throughput at http://websocket.org/quantum.html.

Websockets pitfalls

Websockets is a relatively new protocol that has already undergone a number of versions as various issues are addressed. This is important as support across browsers varies.

At the time of writing Websockets (in some form) can be used by the following browsers (check caniuse.com for the most up to date info):

  • IE10
  • Chrome 13+
  • Firefox 7
  • Safari 5+
  • Opera 11+

Earlier implementations of websockets had some security issues so your connections may work but are not secure (Firefox disabled support in Firefox 4 & 5 for this reason).

The other issue that you may encounter is that some older proxy servers don’t support the http upgrade system that websockets uses to connect so some clients may be unable to connect.

.net 4.5 Web Socket Support

.net 4.5 introduces a number of APIs for working with web sockets. If you find you need more control than the ASP.net API’s offers then look into WCF as that has also been updated.

Before we begin there are a couple of requirements for using ASP.net web sockets API:

  • Application must be hosted on IIS 8 (available only with some version of Windows 8 – please note currently IIS Express currently does not work)
  • Web Sockets protocol feature installed (IIS option)
  • .net 4.5
  • A compatible browser on the client (IE10 or Chrome will 18 work fine at time of writing)
  • It would help if your Chinese birth animal was the horse

Currently Microsoft have no plans to release Websockets support for earlier versions of IIS so if you plan to run it on Windows Server 2008 then you are going to have to look at other options such as http://superwebsocket.codeplex.com/.

You could also look at the SignalR library from Microsoft which is designed for developing async applications and provides WebSockets (and fallback) support: https://github.com/SignalR/SignalR/wiki/WebSockets.

Hello Web Sockets Example!

Ok I am going to assume that you are already working with some version of Windows 8 that has IIS & ASP.net 4.5 installed. The other thing we are going to need to do is make sure IIS has the Web Sockets Protocol feature installed (this is in the add/remove programs bit):

First create a new empty ASP.net project called WebSockets

Add the Nuget package Microsoft.Websockets

Pull down the latest jQuery library and put it in a scripts directory (I am using 1.7.2) – note jQuery isn’t necessary it just saves a bit of tedious event and manipulation code.

Now add a file called index.htm and enter the following code:

<!doctype html>


<script src="Scripts/jquery-1.7.2.min.js" type="text/javascript"></script>

<script type="text/javascript">

$(document).ready(function () {

var name = prompt('what is your name?:');

var url = 'ws://' + window.location.hostname + window.location.pathname.replace('index.htm', 'ws.ashx') + '?name=' + name;

alert('Connecting to: ' + url);

ws = new WebSocket(url);

ws.onopen = function () {

$('#messages').prepend('Connected <br/>');

$('#cmdSend').click(function () {





ws.onmessage = function (e) {

$('#chatMessages').prepend(e.data + '<br/>');


$('#cmdLeave').click(function () {



ws.onclose = function () {

$('#chatMessages').prepend('Closed <br/>');


ws.onerror = function (e) {

$('#chatMessages').prepend('Oops something went wront <br/>');






<input id="txtMessage" />

<input id="cmdSend" type="button" value="Send" />

<input id="cmdLeave" type="button" value="Leave" />

<br />

<div id="chatMessages" />



We need to create an http handler so add a new generic handler to the project called ws.ashx and enter the following code:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

using Microsoft.Web.WebSockets;

namespace WebSockets


public class WSHttpHandler : IHttpHandler


public void ProcessRequest(HttpContext context)


if (context.IsWebSocketRequest)

context.AcceptWebSocketRequest(new TestWebSocketHandler());


public bool IsReusable




return false;





Finally we need to create something to handle the websocket connection (TestWebSocketHandler that is created in the AcceptWebSocketRequest method).

Create a new class called TestWebSocketHandler and enter the following code:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Threading;

using System.Web;

using Microsoft.Web.WebSockets;

namespace WebSockets


public class TestWebSocketHandler : WebSocketHandler


private static WebSocketCollection clients = new WebSocketCollection();

private string name;

public override void OnOpen()


this.name = this.WebSocketContext.QueryString["name"];


clients.Broadcast(name + " has connected.");


public override void OnMessage(string message)


clients.Broadcast(string.Format("{0} said: {1}", name, message));


public override void OnClose()



clients.Broadcast(string.Format("{0} has gone away.", name));




That’s all you need so now compile the project and run it in a compatible browser (IE10 or the latest Chrome will do fine) making sure you are hosting your project from IIS (project properties if you are not).

Once you have run it up you will be prompted to provide a name, then an alert box will indicate the end point of your application (ws://localhost/.. – note the secure https version is wss://).

Now open up a different browser and you should find you can via websockets!

25 thoughts on “Websockets with ASP.net 4.5 and Visual Studio 2012

  1. Nice, this was the first bit of code related to Web Sockets that I was able to get working, there is so much non-working stuff out there because of the earlier prototype versions that were released.

    I should mention that IIS 8 Express now supports Web Sockets, so full blown IIS is not required; what comes with Visual Studio 2012 is fine.

    Also, When that handler is created, it should be created as WSHttpHandler.ashx versus ws.ashx, it creates an error because it doesn’t match the code snippet… or just change your declaration to public class ws : IHttpHandler and that name is fine.

  2. I have encountered several errors such as.OnOpen, OnMessage, OnClose no suitable method found to override and the ‘packages’ element is not declared. When I nuget Microsoft.websockets, it automatically creates package.config, so does it conflict with the default Web.config? I definitely copy paste the code from this web to my project with slightly changes on the class name.

    1. Hi there,
      Package.config & web.config are completely different – package.config is used by Nuget for managing the packages you install.

      If you go to the link below and download the book code examples there is a working example of this which you can use to compare with your setup.


      Unzip the file and then go to ~\Chapter 06 ASP.net\Chapter 6 ASP.net – Web sockets\


      1. sorry to bother you again, I have downloaded the sample and run the sample, but it displayed something went wrong.
        I have double check that my machine has already enable the websocket protocol for iis.

      2. I have double check again possible error and I have found that the IIS responses a 404 code. Wond

      3. Hi there,

        Can you access the example page index.htm?
        Check you are running the example in IIS on Windows 8 (not the inbuilt Visual Studio debugger) or Windows Server 2012 and you have enabled web sockets
        Can you access the handler at ws.ashx?
        Check you are accessing the example at http://localhost/whatever/index.htm – the JavaScript is a bit hacky as just an example but replaces index.htm with the “endpoint” for the websocket at ws.ashx

      4. I’m trying this on Windows 8 and IIS server. I enabled websockets in IIS. However everytime i go to index.htm it just says Closed. Oops Something went wrong.

        I can’t see to access ws.ashx. I assume something should pop up besides 404 when I go to that.

      5. I am using an unmodified version of that download, the class name and namespace seem correct and they seem to compile correctly, but upon publishing to IIS it seems to complain for some reason.

      6. Yeah it must be IIS, the example still isn’t working properly and not sure why it would complain that it can’t see this class. Is there some option I need to enable to server .ashx properly? Here’s an image of my error in case anyone out there can help http://i.imgur.com/9eHFw.png

      7. That was indeed the issue. It’s been awhile since I’ve had to do anything IIS related. Also you do need to make sure you are at index.htm not just /. It’s working perfectly now, thanks.

  3. 1. I’m using windows 8
    2. I have double check that I already have enabled the web socket
    3. I tried to access the ws.ashx by remapping the url (index.htm to ws.ashx) (shown in this tutorial http://www.dotnetperls.com/ashx). Unfortunately, I can’t access. But when I did it from scratch by creating a new project, it able to access.

    I access using this URL -> http://localhost:5707/index.htm and the pop up message shows that I’m connecting to ws://localhost/ws.ashx?name=hi

    Btw, I managed to get the signalR to work. And 1 more, I got an example from this site http://www.paulbatum.com/2011/10/getting-to-know-systemnetwebsockets.html, and his websocket managed to work on my machine, but I must get my VS to run in admin mode.

    1. Thanks. Great hadn’t seen that library – will be sure to take a look at it – as you say the requirements for the .net 4.5 one limit its usage 🙂

Comments are closed.