Click here to Skip to main content
65,938 articles
CodeProject is changing. Read more.
Articles / web / ASP.NET

Using WebSocket in .NET 4.5 (Part 4)

5.00/5 (10 votes)
29 Jul 2013CPOL3 min read 115.5K   7.1K  
Using WebSocket with Microsoft.WebSockets.dll.

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: 

Image 1

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

C#
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: 

C#
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

C#
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: 

C#
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:   

C#
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: 

XML
<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:

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)