VS运行正常的Telegram Bot发布到IIS出现HttpRequestException异常
根因分析
- VS调试模式下程序会继承当前登录Windows用户的网络配置,你本地登录用户已经配置过企业代理,因此访问Telegram API的请求可以正常通过代理转发,不会报错。
- 发布到IIS后,站点对应的应用程序池默认使用内置服务账户(如
IIS AppPool\站点名、NetworkService等)运行,这类账户不会继承普通登录用户的代理配置,也没有单独配置企业代理,发起的Telegram API请求会直连外网,被企业网络策略拦截后触发连接超时,也就是你看到的Socket错误10060。
可用修复方案
方案1:代码中显式给Bot客户端配置代理
初始化TelegramBotClient时,传入绑定了企业代理配置的HttpClient即可,示例代码如下:
// 配置企业代理 var webProxy = new WebProxy("代理地址:代理端口", BypassOnLocal: false) { // 若代理需要身份验证,补充下面的凭据配置 Credentials = new NetworkCredential("代理认证用户名", "代理认证密码") }; var httpClientHandler = new HttpClientHandler { Proxy = webProxy, UseProxy = true }; using var httpClient = new HttpClient(httpClientHandler); // 用带代理配置的HttpClient初始化Bot客户端 var botClient = new TelegramBotClient("你的Bot Token", httpClient);
方案2:修改IIS应用程序池运行身份
将站点对应的应用程序池标识更换为你本地已经配置好代理的Windows用户:
- 打开IIS管理器,找到当前站点对应的应用程序池,右键选择「高级设置」
- 定位到「进程模型」分类下的「标识」项,点击右侧的省略号按钮
- 选择「自定义账户」,点击「设置」,输入代理配置正常的Windows用户名和密码,保存后重启应用程序池即可生效。
方案3:给系统服务账户配置全局代理
不需要修改代码和应用池配置,管理员身份运行命令提示符执行以下命令配置WinHTTP全局代理即可:
netsh winhttp set proxy 代理地址:代理端口 "<local>"
如果后续需要清除代理配置,执行:
netsh winhttp reset proxy
内容的提问来源于stack exchange,提问作者Bydlo
相关产品推荐
相关产品推荐

