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

ASP.NET Core MVC中点击HTML按钮触发C# TCP请求的实现方案

问题解决:ASP.NET Core MVC点击按钮触发后端TCP请求

你在ASP.NET Core MVC中要实现点击按钮后由后端发起TCP请求,再返回Index页面,不需要JavaScript就能搞定,原代码的问题主要在表单路由和后端代码的几个细节上,下面是修正方案:

1. 修正视图中的表单代码

原表单的控制器参数错误,MVC中指定控制器名称时不需要加Controller后缀,把"HomeController"改成"Home"即可,同时建议显式指定请求方法:

<div class="row">
    <div class="col-sm-4">
        <div class="card-body b">
            @using (Html.BeginForm("HandleButtonOn", "Home", FormMethod.Post))
            {
                <button type="submit" name="ButtonOn" class="btn btn-success btn-lg btn-block" value="1">High Power</button>
            }
        </div>
    </div>
</div>

2. 修正后端Controller代码

原代码存在请求阻塞、无限重试、资源未释放等问题,修改后的代码如下:

namespace Flexi_Arm.Controllers
{
    public class HomeController : Controller
    {
        private readonly ILogger<HomeController> _logger;

        public HomeController(ILogger<HomeController> logger)
        {
            _logger = logger;
        }

        public IActionResult Index()
        {
            return View();
        }

        [HttpPost]
        public IActionResult HandleButtonOn(string ButtonOn)
        {
            // 限制重试次数,避免无限循环占用资源
            int retryCount = 3;
            bool isConnected = false;

            while (retryCount > 0 && !isConnected)
            {
                try
                {
                    // 使用using自动释放资源,避免内存泄漏
                    using (TcpClient client = new TcpClient("127.0.0.1", 1302))
                    using (NetworkStream stream = client.GetStream())
                    {
                        string messageToSend = "My name is Neo";
                        byte[] sendData = Encoding.ASCII.GetBytes(messageToSend);

                        stream.Write(sendData, 0, sendData.Length);
                        _logger.LogInformation("发送数据至TCP服务器...");

                        using (StreamReader sr = new StreamReader(stream))
                        {
                            string response = sr.ReadLine();
                            _logger.LogInformation("服务器响应: {Response}", response);
                        }
                    }
                    isConnected = true;
                }
                catch (Exception e)
                {
                    _logger.LogError(e, "TCP连接失败,剩余重试次数: {RetryCount}", retryCount - 1);
                    retryCount--;
                    Thread.Sleep(1000); // 重试前短暂延迟
                }
            }

            return RedirectToAction("Index"); // 用重定向确保路由规范,避免重复提交
        }
    }
}

关键修改说明:

  • 用[HttpPost]标记Action,和表单的Post请求方法对应
  • 替换Console.WriteLine为ILogger日志,Web应用需通过日志系统查看输出,而非控制台
  • 移除Console.ReadKey(),避免请求阻塞
  • 用using语句包裹所有需要释放的资源,自动回收内存
  • 把goto改为带次数限制的循环,防止无限重试
  • 用RedirectToAction代替直接返回View,确保页面路由正确

修改完成后,点击按钮即可触发后端TCP请求,执行完成后自动跳回Index页面,全程无需JavaScript。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 16:55:28