Using WebSocket in .NET 4.5 (Part 4)

来源:互联网 发布:免费域名加解析 编辑:程序博客网 时间:2024/05/01 01:43

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

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

  • 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 
原创粉丝点击