我正在尝试为ASP.NET C#中的WordPress WooCommerce发送的Webhooks创建WebHookHandler。

我首先创建一个ASP.NET C#Azure API App WebApplication项目,然后添加相关的引用(Microsoft.AspNet.WebHooks.Common,Microsoft.AspNet.WebHooks.Receivers,Microsoft.AspNet.WebHooks.Receivers.WordPress)。添加了WebHookConfig,WordPressWebHookHandler并在GlobalAsax中注册了WebHookConfig。

然后,我将该应用程序发布为Azure App Service。

我的WordPressWebHookHandler仍然是示例的默认值,如下所示:

public class WordPressWebHookHandler : WebHookHandler
{
    public override Task ExecuteAsync(string receiver, WebHookHandlerContext context)
    {
        // make sure we're only processing the intended type of hook
        if("WordPress".Equals(receiver, System.StringComparison.CurrentCultureIgnoreCase))
        {
            // todo: replace this placeholder functionality with your own code
            string action = context.Actions.First();
            JObject incoming = context.GetDataOrDefault<JObject>();
        }

        return Task.FromResult(true);
    }
}

在WooCommerce中测试用户创建WebHook时,我可以在日志中看到以下请求。

c# - WordPress WooCommerce ASP.net API WebHookHandler : The WebHook request must contain an entity body formatted as HTML Form Data-LMLPHP

但不幸的是,它在调试时从未收到,我看到以下错误。

c# - WordPress WooCommerce ASP.net API WebHookHandler : The WebHook request must contain an entity body formatted as HTML Form Data-LMLPHP

我在想也许我需要一个自定义WebHook而不是WordPress特定的WebHook,因为这是WooCommerce Webhook。或者可能是在路由中处理错误并最终在另一个 Controller 中。

任何帮助深表感谢。

最佳答案

您的WebHookReceiver错误

期望HTML表单数据不匹配,而实际上它应该期望JSON。



,这就是导致您出错的原因。 如果您查看WordPressWebHookReceiver方法的实现ReceiveAsync(),则会调用ReadAsFormDataAsync()方法,它是而不是您想要的,因为Content-Typejson。因此,您想做ReadAsJsonAsync()

解决方案:不要使用WordPressWebHookReceiver并将其切换到另一个将称为ReadAsJsonAsync()的代码。

看代码



您有正确的想法,所以我挖掘了一些代码来解释为什么会这样。

下面的代码块是WordPressWebHookReceiver中重写的ReceiveAsync()方法。您可以看到它正在调用ReadAsFormDataAsync()而不是您想要的...

public override async Task<HttpResponseMessage> ReceiveAsync(
    string id, HttpRequestContext context, HttpRequestMessage request)
{
    ...
    if (request.Method == HttpMethod.Post)
    {
        // here is what you don't want to be called
        // you want ReadAsJsonAsync(), In short, USE A DIFFERENT RECEIVER.
        NameValueCollection data = await ReadAsFormDataAsync(request);
        ...
    }
    else
    {
       return CreateBadMethodResponse(request);
    }
}

在存储库中快速搜索调用ReadAsJsonAsync()方法的类,表明以下接收者实现了该方法:
  • DynamicsCrmWebHookReceiver
  • ZendeskWebHookReceiver
  • AzureAlertWebHookReceiver
  • KuduWebHookReceiver
  • MyGetWebHookReceiver
  • VstsWebHookReceiver
  • BitbucketWebHookReceiver
  • CustomWebHookReceiver
  • DropboxWebHookReceiver
  • GitHubWebHookReceiver
  • PaypalWebHookReceiver
  • StripeWebHookReceiver
  • PusherWebHookReceiver

  • 我认为CustomWebHookReceiver可以满足您的要求,因此可以捕获NuGet here。否则,您可以实现自己的类,或者从此类中派生它,等等。

    配置WebHook Recevier

    (从Microsoft Documentation复制)



    初始化WebHook接收器

    10-07 15:30