Using WebSocket in .NET 4.5 (Part 4)

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 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. 

Background    

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: 

Using WebSocket in .NET 4.5 (Part 4)_第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

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. 

Host as WCF Service  

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;
    }
} 

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 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. 

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:

  • Part 1: Overview on WebSocket protocol and .NET support
  • Part 2: Using WebSocket in Traditional ASP.NET and MVC 4
  • Part 3: Using WCF support for WebSocket 
  • Part 4: Using Microsoft.WebSockets.dll 

你可能感兴趣的:(Web,Development,.NET,Development)