Asp.net自定义Web挂钩
本文关键字:挂钩 Web 自定义 net Asp | 更新日期: 2023-09-27 18:19:44
我正在尝试学习webhook,我的需求需要有一个可以发布一些数据的发布者,并且它的所有订阅者都会收到webhook通知。这是我的要求,我需要在本地主机中同时拥有发布者和接收者。
我正在试用下面的帖子。http://blogs.msdn.com/b/webdev/archive/2015/09/15/sending-webhooks-with-asp-net-webhooks-preview.aspx
每当我调用subscribe方法时,它都会失败。请给我忠告,我是否做错了什么。
function subscribe() {
$.ajax({
type: "POST",
url: "/api/webhooks/registrations",
data: JSON.stringify({
WebHookUri: "http://localhost:59927/api/webhooks/incoming/custom",
Secret: "12345678901234567890123456789012",
Description: "My first WebHook!"
}),
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function(data, status) { alert(status); },
failure: function(errMsg) { alert(errMsg); }
});
return false;
}
这是我调用subscribe方法时的错误消息。
"消息":"WebHook验证失败。请确保WebHook URI有效,并且端点可访问。遇到错误:NotFound","ExceptionMessage":"WebHook验证失败。请确保WebHook URI是有效的,并且端点是可访问的。遇到错误:NotFound","ExceptionType":"System.InvalidOperationException"
这是我的WebApiConfig.cs文件
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web API configuration and services
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
// Load Web API controllers
config.InitializeCustomWebHooks();
config.InitializeCustomWebHooksApis();
config.InitializeReceiveCustomWebHooks();
}
}
和Global.asax文件
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
GlobalConfiguration.Configure(WebApiConfig.Register);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
遇到了同样的问题(使用最新版本(RC1)的WebHooks包)。
我使用GitHub上的源代码找到了它。注册WebHook时,注册端点会向WebHook url发送Get请求(htp://host/api/webhooks/incoming/custom)以检查它是否是有效的url。在我的情况下,由于控制器不存在,所以找不到端点。
我已设法通过确保加载包含提供api/webhooks/incoming
端点的WebHookReceiversController
的程序集来解决此问题。将您的代码更改为:
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Make sure the assembly Microsoft.AspNet.WebHooks.Receivers is loaded
var controllerType = typeof (WebHookReceiversController);
// Web API configuration and services
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
// Load Web API controllers
config.InitializeCustomWebHooks();
config.InitializeCustomWebHooksApis();
config.InitializeReceiveCustomWebHooks();
config.EnsureInitialized();
var webhookRoutes = config.Routes;
; // Set breakpoint here and inspect the variable above, you should see the custom incoming webhook route listened.
}
}
注:线路
var controllerType = typeof (WebHookReceiversController);
添加。
如果在映射路由之前未加载该程序集,则不会发现控制器,因此不会将其包括在api已知的路由中,因此会出现NotFound错误。
使用自托管api项目的完整端到端项目可以在这里找到:https://github.com/Expecho/WebHooks-PoC
通过将HTTP端口设置为正确的值,例如,确保WebHookURI属性指向您的实际服务器
http://localhost:YOURPORTVALUE/api/webhooks/incoming/custom
http://localhost:12345/
您可能还错过了以下行:
config.InitializeCustomWebHooksAzureStorage();
在您的WebApiConfig.cs 中
我们只使用本地开发存储,因此设置MS_AzureStoreConnectionString连接字符串
看看下面的
以下Nuget包提供了对发送WebHooks的支持:
Microsoft.AspNet.WebHooks.Custom:此包提供了将WebHook支持添加到ASP.NET项目中的核心功能。该功能允许用户使用简单的pub/sub模型注册WebHook,并允许您的代码将WebHook发送给具有匹配WebHook注册的接收器。
Microsoft.AspNet.WebHooks.Custom.AzureStorage此软件包为在Microsoft Azure表存储中持久化WebHook注册提供可选支持。
Microsoft.AspNet.WebHooks.Custom.SqlStorage此软件包为在SQL中持久化WebHook注册提供可选支持。有关如何使用它的描述,请参阅Microsoft ASP.NET WebHooks预览更新。
Microsoft.AspNet.WebHooks.Custom.Mvc此包公开了从ASP.NET Mvc控制器中访问WebHooks功能的可选帮助程序。帮助程序通过MVC控制器协助提供WebHook注册,并创建要发送给WebHook登录者的事件通知。
Microsoft.AspNet.WebHooks.Custom.Api此包包含一组可选的ASP.NET Web Api控制器,用于通过REST-style接口管理筛选器和注册。
是一个很好的起点
https://github.com/aspnet/WebHooks/tree/master/samples
您的启动看起来与文章不同:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Http;
namespace WebApplication2
{
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web API configuration and services
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
// Load Web API controllers and Azure Storage store
config.InitializeCustomWebHooks();
config.InitializeCustomWebHooksAzureStorage();
config.InitializeCustomWebHooksApis();
config.InitializeReceiveCustomWebHooks();
}
}
}
特别注意这一行:
config.InitializeCustomWebHooksAzureStorage();
您没有任何存储设置。希望这能帮助到别人。
欢呼
如果有人仍然有这个例子的问题(即使在一年后!),这里有一个解决我痛苦的包:
Install-Package Microsoft.AspNet.WebHooks.Receivers.Custom -Pre
这是接收器的最新版本。
https://www.nuget.org/packages/Microsoft.AspNet.WebHooks.Receivers.Custom/1.2.0-rc2
玩得开心!