如何在ASP.NET Web Forms中配置路由接收带/pix的Webhook POST请求
解决方案
针对你的需求,有三种可行的配置方式,你可以根据实际场景选择:
方式一:复用现有路由,扩展方法参数
你的默认路由已经包含可选的{id}参数,/pix部分正好对应这个参数。只需修改控制器方法,添加id参数即可:
<System.Web.Http.HttpPost> Public Sub WebHook(ByVal request As HttpRequestMessage, Optional ByVal id As String = Nothing) Dim json = request.Content.ReadAsStringAsync().Result ' 根据id判断是否为pix请求 If id = "pix" Then ' 处理第三方pix WebHook逻辑 Else ' 原有WebHook逻辑 End If ... End Sub
这样请求https://example.com/api/NotesApi/WebHook/pix时,id参数会被自动赋值为"pix",原有https://example.com/api/NotesApi/WebHook的请求也能正常触发,此时id为Nothing。
方式二:添加专属路由规则
如果想让/pix的路由更明确,可以在Global.asax的路由配置中,添加一条优先于默认路由的专属规则:
' 先添加专属路由 RouteTable.Routes.MapHttpRoute( name:="WebHookPixRoute", routeTemplate:="api/{controller}/WebHook/pix", defaults:=New With {Key .action = "WebHookPix"} ) ' 再保留原有默认路由 RouteTable.Routes.MapHttpRoute( name:="DefaultApi", routeTemplate:="api/{controller}/{action}/{id}", defaults:=New With {Key .id = System.Web.Http.RouteParameter.[Optional]} )
然后在NotesApiController.vb中新增对应方法:
<System.Web.Http.HttpPost> Public Sub WebHookPix(ByVal request As HttpRequestMessage) Dim json = request.Content.ReadAsStringAsync().Result ' 处理第三方pix WebHook逻辑 ... End Sub
这种方式下,/WebHook/pix的请求会直接触发WebHookPix方法,和原有WebHook方法完全分离。
方式三:使用特性路由(更灵活)
.NET 4.6.1的Web API支持特性路由,先在Global.asax中启用特性路由:
' 先启用特性路由 System.Web.Http.GlobalConfiguration.Configuration.MapHttpAttributeRoutes() ' 再注册默认路由 RouteTable.Routes.MapHttpRoute( name:="DefaultApi", routeTemplate:="api/{controller}/{action}/{id}", defaults:=New With {Key .id = System.Web.Http.RouteParameter.[Optional]} )
然后在控制器方法上直接指定路由:
方式3.1:为pix请求单独配置路由
<System.Web.Http.Route("api/NotesApi/WebHook/pix")> <System.Web.Http.HttpPost> Public Sub WebHookPix(ByVal request As HttpRequestMessage) Dim json = request.Content.ReadAsStringAsync().Result ' 处理pix请求逻辑 ... End Sub
方式3.2:通用路由匹配多种类型
如果未来可能有其他类似/pix的子路径,可以用占位符参数:
<System.Web.Http.Route("api/NotesApi/WebHook/{webHookType}")> <System.Web.Http.HttpPost> Public Sub WebHook(ByVal request As HttpRequestMessage, ByVal webHookType As String) Dim json = request.Content.ReadAsStringAsync().Result Select Case webHookType Case "pix" ' 处理pix逻辑 Case ' 其他类型 ' 对应处理 End Select ... End Sub
内容的提问来源于stack exchange,提问作者Premy
相关产品推荐
相关产品推荐

