我正在尝试为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时,我可以在日志中看到以下请求。
但不幸的是,它在调试时从未收到,我看到以下错误。
我在想也许我需要一个自定义WebHook而不是WordPress特定的WebHook,因为这是WooCommerce Webhook。或者可能是在路由中处理错误并最终在另一个 Controller 中。
任何帮助深表感谢。
最佳答案
您的WebHookReceiver错误
期望HTML表单数据不匹配,而实际上它应该期望JSON。
,这就是导致您出错的原因。 如果您查看WordPressWebHookReceiver
方法的实现ReceiveAsync()
,则会调用ReadAsFormDataAsync()
方法,它是而不是您想要的,因为Content-Type
是json
。因此,您想做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()
方法的类,表明以下接收者实现了该方法:我认为CustomWebHookReceiver可以满足您的要求,因此可以捕获NuGet here。否则,您可以实现自己的类,或者从此类中派生它,等等。
配置WebHook Recevier
(从Microsoft Documentation复制)
初始化WebHook接收器