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

如何让.NET 4.7.2 Web API通过SSL/TLS连接控制台应用传输数据

实现Web API与SSL/TLS监听的控制台应用直接数据收发(.NET 4.7.2)

你不需要额外搭建HTTP服务器,直接利用TCP+SSL/TLS实现双向通信即可,以下是两种可行的实现思路:

方案一:基于SslStream的原生TCP+SSL/TLS实现

这种方式贴近底层,可自定义通信协议,适合对数据格式和性能有严格要求的场景。

控制台端(SSL/TLS服务端)

以下是完整的服务端实现(包含SSL证书加载和连接处理):

using System;
using System.Net;
using System.Net.Sockets;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Threading.Tasks;

class SslTcpServer
{
    private static X509Certificate2 _serverCert;

    static async Task Main(string[] args)
    {
        // 加载SSL证书(替换为你的PFX证书路径和密码)
        _serverCert = new X509Certificate2("server-cert.pfx", "your-cert-password");

        // 监听指定端口(支持所有网卡)
        var listener = new TcpListener(IPAddress.Any, 12345);
        listener.Start();
        Console.WriteLine("SSL/TLS服务已启动,监听端口12345");

        while (true)
        {
            // 异步接受客户端连接
            var client = await listener.AcceptTcpClientAsync();
            // 后台处理连接,不阻塞主线程
            _ = HandleClientConnection(client);
        }
    }

    private static async Task HandleClientConnection(TcpClient client)
    {
        using (client)
        using (var sslStream = new SslStream(client.GetStream(), false))
        {
            try
            {
                // 执行SSL/TLS握手,关闭客户端证书验证(按需开启)
                await sslStream.AuthenticateAsServerAsync(
                    _serverCert, 
                    clientCertificateRequired: false, 
                    checkCertificateRevocation: false);

                // 读取Web API发送的数据
                var buffer = new byte[1024];
                var bytesRead = await sslStream.ReadAsync(buffer, 0, buffer.Length);
                var requestData = Encoding.UTF8.GetString(buffer, 0, bytesRead);
                Console.WriteLine($"收到数据:{requestData}");

                // 发送响应给Web API
                var response = $"控制台已接收数据:{requestData}";
                var responseBuffer = Encoding.UTF8.GetBytes(response);
                await sslStream.WriteAsync(responseBuffer, 0, responseBuffer.Length);
            }
            catch (Exception ex)
            {
                Console.WriteLine($"连接处理异常:{ex.Message}");
            }
        }
    }
}

Web API端(SSL/TLS客户端)

在Web API控制器中实现客户端逻辑,主动连接控制台的SSL/TLS服务:

using System;
using System.Net.Sockets;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Threading.Tasks;
using System.Web.Http;

public class ConsoleConnectorController : ApiController
{
    [HttpPost]
    public async Task<IHttpActionResult> SendData([FromBody] string data)
    {
        // 替换为控制台应用所在机器的IP和监听端口
        var consoleIp = "192.168.xxx.xxx";
        const int consolePort = 12345;

        using (var client = new TcpClient())
        {
            await client.ConnectAsync(consoleIp, consolePort);
            using (var sslStream = new SslStream(client.GetStream(), false, ValidateServerCert))
            {
                try
                {
                    // 发起SSL/TLS握手
                    await sslStream.AuthenticateAsClientAsync(consoleIp);

                    // 发送数据到控制台
                    var dataBuffer = Encoding.UTF8.GetBytes(data);
                    await sslStream.WriteAsync(dataBuffer, 0, dataBuffer.Length);

                    // 读取控制台响应
                    var responseBuffer = new byte[1024];
                    var bytesRead = await sslStream.ReadAsync(responseBuffer, 0, responseBuffer.Length);
                    var response = Encoding.UTF8.GetString(responseBuffer, 0, bytesRead);

                    return Ok(new { Success = true, ConsoleResponse = response });
                }
                catch (Exception ex)
                {
                    return InternalServerError(ex);
                }
            }
        }
    }

    // 验证服务器证书(测试环境可跳过严格验证,生产环境需完善逻辑)
    private static bool ValidateServerCert(object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors errors)
    {
        // 生产环境请根据证书颁发机构、有效期等进行严格验证
        if (errors == SslPolicyErrors.None)
            return true;

        Console.WriteLine($"证书验证错误:{errors}");
        // 自签名证书可返回true,生产环境不建议
        return true;
    }
}

方案二:使用WCF实现SSL/TLS通信

WCF是.NET4.7.2原生支持的通信框架,自带SSL/TLS配置,无需手动处理底层流,开发效率更高。

控制台端(WCF服务端)

  1. 定义服务契约:
using System.ServiceModel;

[ServiceContract]
public interface IConsoleDataService
{
    [OperationContract]
    string ExchangeData(string input);
}

public class ConsoleDataService : IConsoleDataService
{
    public string ExchangeData(string input)
    {
        Console.WriteLine($"Web API发送数据:{input}");
        return $"控制台响应:已处理数据「{input}」";
    }
}
  1. 启动WCF服务(启用SSL/TLS):
using System;
using System.ServiceModel;

class WcfSslServer
{
    static void Main(string[] args)
    {
        // 使用WSHttpBinding启用Transport层SSL/TLS
        var binding = new WSHttpBinding(SecurityMode.Transport);
        binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.None;

        // 服务地址(HTTPS协议)
        var serviceUri = new Uri("https://0.0.0.0:12345/ConsoleDataService");
        using (var host = new ServiceHost(typeof(ConsoleDataService), serviceUri))
        {
            host.AddServiceEndpoint(typeof(IConsoleDataService), binding, "");

            // 配置服务证书(需提前将证书绑定到端口,或通过代码指定指纹)
            // host.Credentials.ServiceCertificate.SetCertificate(StoreLocation.LocalMachine, StoreName.My, X509FindType.FindByThumbprint, "证书指纹");

            host.Open();
            Console.WriteLine($"WCF SSL服务已启动,地址:{serviceUri}");
            Console.ReadLine();
        }
    }
}

Web API端(WCF客户端)

  1. 添加服务引用:在Web API项目中右键「添加」→「服务引用」,输入控制台的WCF服务地址生成客户端代理。
  2. 在控制器中调用服务:
using System.Web.Http;
using YourServiceReferenceNamespace; // 替换为实际的服务引用命名空间

public class WcfConsoleClientController : ApiController
{
    [HttpPost]
    public IHttpActionResult SendDataToConsole([FromBody] string data)
    {
        try
        {
            using (var client = new ConsoleDataServiceClient())
            {
                var response = client.ExchangeData(data);
                return Ok(new { Success = true, Response = response });
            }
        }
        catch (Exception ex)
        {
            return InternalServerError(ex);
        }
    }
}

关键注意事项

  • 证书配置:两种方案都需要SSL证书,测试可用自签名证书,生产环境必须使用CA颁发的合法证书;证书需绑定到控制台监听的端口(可通过netsh http add sslcert命令配置)。
  • 防火墙设置:确保控制台所在机器的监听端口(如12345)对外开放,允许Web API机器的入站连接。
  • 连接策略:如果需要频繁通信,可复用SSL/TLS连接避免重复握手;单次请求则使用短连接更简洁。
  • 兼容性:两种方案都完全兼容.NET4.7.2,无需额外安装依赖。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 01:20:58