gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-10-31 22:14:22 27 4
gpt4 key购买 nike

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

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

然后我将该应用程序发布为 Azure 应用服务。

我的 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 时,我可以在日志中看到如下请求。

Webhook request log

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

Webook request log error

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

非常感谢任何帮助。

最佳答案

你的 WebHookReceiver 是错误的

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

WordPressWebHookHandler is still the default

这就是导致错误的原因。如果您查看 WordPressWebHookReceiverReceiveAsync() 方法实现,调用 ReadAsFormDataAsync() 方法,这不是您想要的,因为您的Content-Typejson。所以,您想执行 ReadAsJsonAsync()

解决方案:不要使用 WordPressWebHookReceiver 并将其切换到另一个将调用 ReadAsJsonAsync() 的对象。


看代码

I am thinking maybe I need a custom WebHook instead of the WordPress specific one as this is a WooCommerce Webhook.

你的想法是对的,所以我挖掘了一些代码来解释为什么会发生这种情况。

下面的代码块是在 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() 方法的类,显示以下接收者实现了它:

  1. DynamicsCrmWebHookReceiver
  2. ZendeskWebHookReceiver
  3. AzureAlertWebHookReceiver
  4. KuduWebHookReceiver
  5. MyGetWebHookReceiver
  6. VstsWebHookReceiver
  7. BitbucketWebHookReceiver
  8. CustomWebHookReceiver
  9. DropboxWebHookReceiver
  10. GitHubWebHookReceiver
  11. PaypalWebHookReceiver
  12. 条纹网络钩子(Hook)接收器
  13. PusherWebHookReceiver

我假设 CustomWebHookReceiver会满足您的要求,所以可以捕获 NuGet here .否则你可以实现你自己的,或者从这个类派生它,等等。


配置 WebHook 接收器

(从 Microsoft Documentation 复制)

Microsoft.AspNet.WebHooks.Receivers.Custom provides support for receiving WebHooks generated by ASP.NET WebHooks

Out of the box you can find support for Dropbox, GitHub, MailChimp, PayPal, Pusher, Salesforce, Slack, Stripe, Trello, and WordPress but it is possible to support any number of other providers

初始化 WebHook 接收器

WebHook Receivers are initialized by registering them, typically in the WebApiConfig static class, for example:

public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
...

// Load receivers
config.InitializeReceiveGitHubWebHooks();
}
}

关于c# - WordPress WooCommerce ASP.net API WebHookHandler : The WebHook request must contain an entity body formatted as HTML Form Data,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42293940/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com