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

PuppeteerSharp如何通过本地IP地址连接BrowserWSEndpoint?

PuppeteerSharp跨主机通过WebSocket连接的解决方案

核心原因:连接拒绝的本质

你之前的连接失败,是因为默认情况下Chrome启动时,DevTools服务仅绑定127.0.0.1(本地回环地址),外部主机无法访问。就算修改WebSocket URL中的Host字段,也无法突破这个绑定限制。


方案一:直接开放Chrome监听所有网卡(简单场景)

这是最直接的解决方式,不需要额外代理库,只需在启动PuppeteerSharp时配置Chrome参数,让其监听所有网卡:

主机A(启动PuppeteerSharp的主机)代码修改:

var launchOptions = new LaunchOptions
{
    Headless = false,
    Args = new[]
    {
        "--remote-debugging-address=0.0.0.0", // 让Chrome监听所有网卡的请求
        "--remote-debugging-port=60597" // 指定固定端口,避免随机端口带来的连接麻烦
    }
};

var browser = await Puppeteer.LaunchAsync(launchOptions);
// 生成可被外部访问的WebSocket地址
var accessibleWsUri = new UriBuilder(browser.WebSocketEndpoint)
{
    Host = "192.168.0.199" // 替换为主机A的局域网IP
}.Uri.ToString();

Console.WriteLine(accessibleWsUri);

主机B(连接端)代码:

直接使用上面生成的WebSocket地址连接即可,此时不会出现连接拒绝:

var connectOptions = new ConnectOptions
{
    BrowserWSEndpoint = "ws://192.168.0.199:60597/devtools/browser/5f79c230-7e69-49f5-8f12-816c343cf4f8"
};

var browser = await Puppeteer.ConnectAsync(connectOptions);

注意事项:

  • 确保主机A的防火墙开放了指定的端口(比如60597),允许局域网内的访问。
  • 如果不需要固定端口,可以去掉--remote-debugging-port参数,使用随机端口,但需要同步传递给连接端。

方案二:使用代理库(对应Node.js的http-proxy方案)

如果需要更灵活的控制(比如认证、请求转发规则),可以使用C#生态中的代理库,推荐ProxyKit(轻量WebSocket代理库)或Yarp(微软官方反向代理)。以下以ProxyKit为例:

步骤1:安装NuGet包

在主机A的项目中安装ProxyKit:

Install-Package ProxyKit
# 或者用.NET CLI
dotnet add package ProxyKit

步骤2:主机A启动WebSocket代理

编写代理服务代码,将外部WebSocket请求转发到本地Chrome的DevTools服务:

using Microsoft.AspNetCore.Builder;
using ProxyKit;

var builder = WebApplication.CreateBuilder();
var app = builder.Build();

// 启用WebSocket支持
app.UseWebSockets();

// 代理逻辑:转发WebSocket请求到本地Chrome DevTools
app.Run(async context =>
{
    if (context.WebSockets.IsWebSocketRequest)
    {
        // 本地Chrome的WebSocket服务地址
        var targetChromeWsUri = new Uri("ws://localhost:60597" + context.Request.Path + context.Request.QueryString);
        // 转发WebSocket连接
        await context.WebSockets.ProxyWebSocketTo(targetChromeWsUri);
    }
});

// 让代理服务监听主机A的局域网IP和指定端口
await app.RunAsync("http://192.168.0.199:8080");

步骤3:主机A启动Chrome

此时Chrome可以保持默认的localhost监听(也可以用方案一的参数):

var launchOptions = new LaunchOptions
{
    Headless = false,
    Args = new[] { "--remote-debugging-port=60597" }
};

var browser = await Puppeteer.LaunchAsync(launchOptions);
Console.WriteLine(browser.WebSocketEndpoint);

步骤4:主机B连接代理地址

将WebSocket地址中的主机和端口替换为代理服务的地址:

var connectOptions = new ConnectOptions
{
    BrowserWSEndpoint = "ws://192.168.0.199:8080/devtools/browser/5f79c230-7e69-49f5-8f12-816c343cf4f8"
};

var browser = await Puppeteer.ConnectAsync(connectOptions);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 23:20:27