Click here to Skip to main content
15,867,308 members
Articles / Web Development / ASP.NET

Using WebSocket in .NET 4.5 (Part 4)

Rate me:
Please Sign up or sign in to vote.
5.00/5 (10 votes)
29 Jul 2013CPOL3 min read 112.2K   7K   33   8
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)


Written By
Architect
China China
Over 10-years experience in using Microsoft technologies.
At present, working as the architect of a clustered real-time data delivery and visualization system, responsible for the design of component architecture, product packaging and deployment, also targeting private cloud solutions for future.

Comments and Discussions

 
Questionmaximum connection limit ? Pin
Member 747511829-Mar-17 5:24
Member 747511829-Mar-17 5:24 
QuestionHow to run this project Pin
Member 119246185-Jan-16 21:38
Member 119246185-Jan-16 21:38 
Question关于CCF+ websocket 问题? Pin
mysun20086-Jan-15 19:56
mysun20086-Jan-15 19:56 
QuestionError in Websocket Connection Pin
Member 1059575619-Sep-14 2:13
Member 1059575619-Sep-14 2:13 
SuggestionIt seems need more details how to build a iis8 websocket server. Pin
jiang shanshan9-Feb-14 21:58
jiang shanshan9-Feb-14 21:58 
GeneralRe: It seems need more details how to build a iis8 websocket server. Pin
Member 1059575614-Sep-14 20:49
Member 1059575614-Sep-14 20:49 
QuestionChat requires 2 or more people Pin
Dewey4-Jan-14 23:55
Dewey4-Jan-14 23:55 
QuestionUnfortunately it doesn't work :( Pin
Member 390648316-Oct-13 18:08
Member 390648316-Oct-13 18:08 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.