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

在Windows通用JS应用中调用C# TCP服务端无日志输出问题排查

解决UWP JS应用调用C# Runtime Component TCP服务端无输出无响应的问题

我太懂这种代码在控制台里跑的好好的,一放到UWP JS环境就彻底静默的憋屈感——既没报错也没日志,排查起来完全摸不着头脑。咱们一步步拆解问题,把你的服务端和调用逻辑理顺:

1. 先改掉坑人的async void

你在Connection方法里用了async void,这在UWP跨组件调用里是致命问题:

  • 异步方法抛出的异常会被系统直接吞掉,你连错误信息都看不到
  • JS调用时没法等待方法执行完成,可能代码跑了但服务端根本没启动成功

把方法改成async Task,JS里用await配合异步函数调用:

修正后的C# Runtime Component代码

using System;
using System.Diagnostics;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;

public sealed class Server
{
    private TcpListener _server;
    private const int PortNumber = 1234; // 补全端口号定义,原代码遗漏了这个变量

    public Server()
    {
        Debug.WriteLine("Server instance initialized...");
    }

    // 把async void改为async Task,让调用方能捕获异常、等待执行
    public async Task Connection()
    {
        try
        {
            // 用IPAddress.Any监听所有网卡,避免IP绑定错误
            _server = new TcpListener(IPAddress.Any, PortNumber);
            _server.Start();
            Debug.WriteLine($"Server started, listening on port {PortNumber}");

            while (true)
            {
                // 异步等待客户端连接,不会阻塞线程
                var client = await _server.AcceptTcpClientAsync();
                Debug.WriteLine($"New client connected: {client.Client.RemoteEndPoint}");

                using var stream = client.GetStream();
                var recievedBuffer = new byte[100];
                // 用异步读取代替同步Read,避免阻塞UWP主线程
                int bytesRead = await stream.ReadAsync(recievedBuffer, 0, recievedBuffer.Length);
                
                // 只解析实际读取到的字节,避免多余空字符
                string msg = Encoding.UTF8.GetString(recievedBuffer, 0, bytesRead);
                Debug.WriteLine($"Received message: {msg.Trim()}");
            }
        }
        catch (Exception e)
        {
            Debug.WriteLine($"Server error occurred: {e.ToString()}");
        }
    }

    // 新增停止方法,避免程序退出时资源泄漏
    public void Stop()
    {
        _server?.Stop();
        Debug.WriteLine("Server stopped");
    }
}

修正后的JS调用代码

<script>
console.log("Starting server setup...");
const server = new Server.Server();

// 必须在异步函数里用await,才能等待C#异步方法执行
async function startServer() {
    try {
        // UWP会自动把C#的大驼峰方法名转成小驼峰
        await server.connection();
        console.log("Server connection loop is running");
    } catch (err) {
        // 现在能捕获到C#方法抛出的异常了
        console.error("Failed to start server:", err);
    }
}

startServer();
console.log("Server initialization triggered");
</script>

2. 找对Debug输出的位置

C#里的Debug.WriteLine不会输出到JS的控制台,你得看Visual Studio的输出窗口:

  • 顶部菜单:调试 -> Windows -> 输出
  • 在输出窗口的下拉菜单里选择你的Runtime Component项目(或者选“显示来自所有源的输出”),就能看到C#代码的日志了

3. 给UWP加网络权限!

这是最容易被忽略的点——UWP应用默认没有网络权限,你的TCP服务端会被系统静默拦截:

  1. 打开UWP JS项目的Package.appxmanifest
  2. 切换到「功能」标签页
  3. 勾选私有网络(客户端和服务器)和Internet(客户端和服务器)(根据你的网络环境选择,局域网用私有网络即可)

4. 额外的排查小技巧

  • 把IP换成IPAddress.Any,避免因为网卡绑定错误导致服务端启动失败
  • 检查端口是否被其他程序占用,尽量用1024以上的非系统保留端口
  • 测试时先启动UWP应用,再用Android客户端连接,看输出窗口的日志是否有变化

现在再调试试试,应该能看到服务端启动的日志,客户端连接后也能收到消息了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:32:11