Using WebSocket in .NET 4.5 (Part 4)

本文是关于在.NET 4.5中使用WebSocket的系列教程的第4部分,重点介绍了如何利用Microsoft.WebSockets.dll这个工具包在ASP.NET和WCF服务中轻松实现WebSocket通信。该库将.NET的WebSocket API包装成事件驱动的形式,支持文本和二进制消息。文中提供了在ASP.NET中创建WebSocket服务器的简化代码示例,并指导了在IIS中以WCF服务形式托管WebSocket的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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: 


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:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值