You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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连接。

  1. 新建一个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;
}
  1. 配置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>

三、测试步骤

  1. 运行你的ASP.NET Web Form项目,打开WebSocketTest.aspx页面。
  2. 在输入框中输入消息,点击“发送”,就能看到服务端的回复,实现双向通信。
  3. 可以打开多个浏览器窗口测试,服务端会分别处理每个连接。

关键注意事项

  • 确保项目运行在支持WebSocket的环境(IIS 8.0+、IIS Express 8.0+)。
  • 如果部署到远程服务器,需要在IIS管理器中启用WebSocket功能(服务器角色 -> Web服务器 -> 应用程序开发 -> WebSocket协议)。
  • 生产环境中要添加异常处理、连接管理逻辑(比如记录连接、处理异常断开)。

内容的提问来源于stack exchange,提问作者Kumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 01:10:32