【问题标题】:Asp.net Custom Web hookAsp.net 自定义 Webhook
【发布时间】:2016-01-28 19:13:47
【问题描述】:

我正在尝试学习 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;

}

这是我调用订阅方法时的错误消息。

"Message":"WebHook 验证失败。请确保 WebHook URI 有效且端点 是可访问的。遇到错误:NotFound","ExceptionMessage":"WebHook 验证失败。请 确保 WebHook URI 有效并且端点可访问。遇到的错误:未找到” ,"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);
}

【问题讨论】:

    标签: c# asp.net webhooks


    【解决方案1】:

    遇到了同样的问题(使用最新版本 (RC1) 的 WebHooks 包)。

    我使用 GitHub 上的源代码对其进行了跟踪。当您注册 WebHook 时,注册端点会向 WebHook url (htp://host/api/webhooks/incoming/custom) 发送一个 Get 请求,以检查它是否是有效的 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

    【讨论】:

    • @BaqerNaqvi 如果您检查config.Routes 中的所有路由,它会显示您的传入端点吗?
    • 不,我在 WebApiConfig 中的 config.InitializeReceiveCustomWebHooks() 之前放置了一个调试点,并通过将鼠标悬停在 config.Routes.MapHttpRoute... 代码上检查了 config.Routes,它不包括 api/webhooks/incoming /custom 而不是 in 包含两个条目,一个是默认的,第二个是空的。
    • 你应该在所有初始化之后设置一个断点。那会发生什么?你能把你的代码贴在某个地方吗?
    • @BaqerNaqvi 你能看看我的拉取请求吗?看来我错过了EnsureInitialized 电话
    【解决方案2】:

    例如,通过将 HTTP 端口设置为正确的值,确保 WebHookURI 属性指向您的实际服务器

    http://localhost:YOURPORTVALUE/api/webhooks/incoming/custom

    http://localhost:12345/

    您可能还缺少以下行:

            config.InitializeCustomWebHooksAzureStorage();
    

    在您的 WebApiConfig.cs 中

    我们只使用本地开发存储,所以设置 MS_AzureStoreConnectionString 连接字符串

    看看下面的

    以下 Nuget 包提供了对发送 WebHook 的支持:

    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 Preview 的更新。

    Microsoft.AspNet.WebHooks.Custom.Mvc 此包公开了可选的帮助程序,用于从 ASP.NET MVC 控制器中访问 WebHooks 功能。帮助程序通过 MVC 控制器协助提供 WebHook 注册,以及创建要发送给 WebHook 注册者的事件通知。

    Microsoft.AspNet.WebHooks.Custom.Api 此包包含一组可选的 ASP.NET Web API 控制器,用于通过 REST 样式界面管理过滤器和注册。

    这里是一个很好的起点

    https://github.com/aspnet/WebHooks/tree/master/samples

    【讨论】:

      【解决方案3】:

      您的创业公司看起来与文章不同:

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

      您没有任何存储设置。希望这可以帮助某人。

      干杯

      【讨论】:

        【解决方案4】:

        如果有人仍然对那个例子有问题(即使在一年之后!),这里是解决我痛苦的包:

        Install-Package Microsoft.AspNet.WebHooks.Receivers.Custom -Pre
        

        这是最新版本的接收器。

        https://www.nuget.org/packages/Microsoft.AspNet.WebHooks.Receivers.Custom/1.2.0-rc2

        玩得开心!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-04-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-29
          • 2019-09-11
          相关资源
          最近更新 更多