ngrok无法转发Webhook POST请求至本地Web API求助
问题描述
我有一个本地Web API,暴露了接收Webhook调用的POST接口,请求Content-Type为application/x-www-form-urlencoded,代码实现如下:
[Route("api/webhook")] [ApiController] public class WebhooksController : ControllerBase { // POST api/values [HttpPost] [Consumes("application/x-www-form-urlencoded")] public void Post([FromForm] Response webHookResponse) { // these are here only to allow me to create a breakpoint int i = 0; i = 6; } } public class Response { [FromForm(Name = "code_id")] public string codeId { get; set; } [FromForm(Name = "name")] public string name { get; set; } [FromForm(Name = "address")] public string address { get; set; } }
通过Postman调用该接口可正常返回200 OK并触发断点。为让外部系统调用,我使用命令ngrok http http://localhost:44398启动ngrok转发,Visual Studio已关闭“Enable SSL”选项,外部系统配置的Webhook URL为当前活跃的ngrok域名拼接/api/webhook。外部发送的请求在ngrok控制台可见,但本地代码断点未触发,请问该问题的原因是什么?是否有正确的ngrok使用方式或其他解决办法?
问题排查与解决办法
可能的原因
- 端口不匹配:本地Web API实际运行的端口可能不是44398。关闭SSL后,Visual Studio可能自动切换到非SSL端口(比如5000、5001或随机端口),ngrok转发端口和实际运行端口不一致,导致请求没抵达本地API。
- 协议不匹配:即便关闭了Enable SSL,部分项目模板仍可能默认监听HTTPS,ngrok转发HTTP到HTTPS端口会导致请求无法正确传递。
- 请求格式不符:外部系统发送的请求Content-Type可能不是
application/x-www-form-urlencoded,或者参数名和Response类的FromForm注解不匹配,导致API无法匹配到对应Action。 - 调试状态异常:Web API未处于调试运行状态,或者Visual Studio调试进程未正确附加到API进程。
解决办法
- 确认实际运行端口:
启动Web API后,查看Visual Studio输出窗口或浏览器地址栏,确认实际访问端口(如http://localhost:5000),调整ngrok命令为对应端口,例如ngrok http 5000。 - 修正ngrok转发协议:
如果本地API仍使用HTTPS,改用ngrok http https://localhost:44398转发;启动ngrok后,检查控制台输出的转发地址,确保外部系统使用的URL正确(如https://xxxx-xx-xx-xx-xx.ngrok.io/api/webhook)。 - 验证请求正确性:
通过ngrok控制台查看请求详情,确认Content-Type和参数格式符合要求;将ngrok的URL复制到Postman测试,排查是否是外部系统的请求格式问题。 - 检查调试状态:
确保Web API处于调试运行状态(点击了启动调试按钮),若调试异常,重启Visual Studio和Web API后重新附加调试。
内容的提问来源于stack exchange,提问作者Eddie
相关产品推荐
相关产品推荐

