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);
}

Asp.net自定义Web挂钩

遇到了同样的问题(使用最新版本(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

玩得开心!