如何在ASP.NET Web Form中使用C#实现WebSocket[TCP connection]
ASP.NET Web Form(C#)WebSocket 基础双向通信实现
一、服务端实现(Generic Handler)
ASP.NET Web Form本身没有原生的WebSocket控制器,我们可以用**Generic Handler(ASHX)**来处理WebSocket请求,因为它能直接接管HTTP请求并升级为WebSocket连接。
- 新建一个ASHX文件,命名为
WebSocketHandler.ashx,代码如下:
using System; using System.Web; using System.Web.WebSockets; using System.Threading.Tasks; public class WebSocketHandler : IHttpHandler { public void ProcessRequest(HttpContext context) { // 判断当前请求是否为WebSocket请求 if (context.IsWebSocketRequest) { context.AcceptWebSocketRequest(HandleWebSocketAsync); } else { context.Response.StatusCode = 400; context.Response.Write("非WebSocket请求"); } } private async Task HandleWebSocketAsync(AspNetWebSocketContext webSocketContext) { var webSocket = webSocketContext.WebSocket; var buffer = new ArraySegment<byte>(new byte[1024]); // 保持连接循环,直到客户端关闭连接 while (webSocket.State == WebSocketState.Open) { // 接收客户端消息 var receiveResult = await webSocket.ReceiveAsync(buffer, System.Threading.CancellationToken.None); // 如果客户端主动关闭连接 if (receiveResult.MessageType == WebSocketMessageType.Close) { await webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "客户端主动关闭", System.Threading.CancellationToken.None); break; } // 将接收到的消息转为字符串 string receivedMsg = System.Text.Encoding.UTF8.GetString(buffer.Array, 0, receiveResult.Count); Console.WriteLine($"收到客户端消息:{receivedMsg}"); // 构造响应消息,原样返回+服务端标识 string responseMsg = $"服务端已收到:{receivedMsg}"; var responseBuffer = new ArraySegment<byte>(System.Text.Encoding.UTF8.GetBytes(responseMsg)); // 发送响应给客户端 await webSocket.SendAsync(responseBuffer, WebSocketMessageType.Text, true, System.Threading.CancellationToken.None); } } public bool IsReusable => false; }
- 配置Web.config,启用WebSocket支持:
在<system.webServer>节点下添加:
<webSocket enabled="true" />
注意:需要IIS 8.0及以上版本才支持WebSocket,本地调试用VS自带的IIS Express即可(VS2013+的IIS Express默认支持)。
二、客户端实现(Web Form页面)
新建一个Web Form页面(比如WebSocketTest.aspx),在页面中添加JavaScript代码实现客户端WebSocket连接:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebSocketTest.aspx.cs" Inherits="YourNamespace.WebSocketTest" %> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title>WebSocket测试页面</title> </head> <body> <div> <input type="text" id="msgInput" placeholder="输入消息" /> <button onclick="sendMessage()">发送</button> <div id="msgContainer"></div> </div> <script> var webSocket; // 初始化WebSocket连接 function initWebSocket() { // 路径对应你的ASHX文件位置,本地调试格式:ws://localhost:端口号/WebSocketHandler.ashx var wsUrl = "ws://" + window.location.host + "/WebSocketHandler.ashx"; webSocket = new WebSocket(wsUrl); // 连接成功回调 webSocket.onopen = function() { addMsg("已连接到服务端"); }; // 接收服务端消息回调 webSocket.onmessage = function(event) { addMsg("服务端回复:" + event.data); }; // 连接关闭回调 webSocket.onclose = function() { addMsg("连接已关闭"); }; // 错误回调 webSocket.onerror = function(error) { addMsg("连接出错:" + error.message); }; } // 发送消息到服务端 function sendMessage() { var input = document.getElementById("msgInput"); var msg = input.value.trim(); if (msg && webSocket.readyState === WebSocket.OPEN) { webSocket.send(msg); addMsg("你发送了:" + msg); input.value = ""; } } // 添加消息到页面 function addMsg(msg) { var container = document.getElementById("msgContainer"); var p = document.createElement("p"); p.textContent = msg; container.appendChild(p); } // 页面加载时初始化连接 window.onload = initWebSocket; </script> </body> </html>
三、测试步骤
- 运行你的ASP.NET Web Form项目,打开
WebSocketTest.aspx页面。 - 在输入框中输入消息,点击“发送”,就能看到服务端的回复,实现双向通信。
- 可以打开多个浏览器窗口测试,服务端会分别处理每个连接。
关键注意事项
- 确保项目运行在支持WebSocket的环境(IIS 8.0+、IIS Express 8.0+)。
- 如果部署到远程服务器,需要在IIS管理器中启用WebSocket功能(服务器角色 -> Web服务器 -> 应用程序开发 -> WebSocket协议)。
- 生产环境中要添加异常处理、连接管理逻辑(比如记录连接、处理异常断开)。
内容的提问来源于stack exchange,提问作者Kumar
相关产品推荐
相关产品推荐

