0

根据链接https://docs.helloworks.com/v3/reference#callbacks中的文档

“使用 HelloWorks API,您可以使用回调来通知某些事件。目前我们支持在步骤启动、工作流取消和工作流完成时注册回调。

回调 URL 将按照以下方式调用:

curl -X POST https://your.domain.com/some/path
     -H "X-HelloWorks-Signature: {signature}"
     -H "Content-Type: application/json"
     -d "{payload}

我无法弄清楚如何处理 ASP.NET MVC 4.0 中的回调。回调返回 JSON 格式的数据。收到数据后,我可以根据需要对其进行格式化并保存到数据库中。但是我怎样才能在我的控制器中获取数据呢?非常感谢专家对 API 的指导。提前致谢。

4

2 回答 2

1

我无法弄清楚如何处理 ASP.NET MVC 4.0 中的回调。

您需要有一个接受 POST 请求的 api 控制器。然后由 HelloWorks api 调用该 api 端点。描述这种机制的花哨的词是Webhook。可以在这里找到一个很好的介绍。

最基本的将是一个控制器

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;

namespace MyWebAPI.Controllers
{
    public class WebHookController : ApiController
    {
        // POST: api/webhook
        public void Post([FromBody]string value)
        {
        }
    }
}

您需要在 HelloWorks api 中注册 URL https://yourwebsite.domain/api/webhook,以便它知道将数据发送到哪里。

您可能希望保护此端点,以免其他人滥用此 api。请参阅文档以获取一些指导。

例如,在您的情况下,您应该检查名为“X-HelloWorks-Signature”的标头是否在请求中发送到端点。该标头的值是一个哈希值,它应该与您收到的内容的哈希值相匹配。要计算要匹配的哈希码,请使用 SHA-256 算法创建哈希并对结果进行 base16 编码。

Microsoft 还提供了有关如何创建 Web api的文档

于 2019-10-15T09:06:26.597 回答
0

彼得你的指导奏效了。我很感激。这是直截了当的,只有技术术语使它令人生畏:)。以下是有效的代码。我仍然使用签名来保护它。

[HttpPost]
    public ActionResult Callback()
    {
        string rawBody = GetDocumentContents(Request);
        dynamic eventObj = JsonConvert.DeserializeObject(rawBody);

        Test newTest = new Test();
        newTest.Response = "Bikram-1" + (string)eventObj.type;
        var test = db.Tests.Add(newTest);
        db.SaveChanges();

        return Content("Success!");
    }

    private string GetDocumentContents(HttpRequestBase Request)
    {
        string documentContents;
        using (Stream receiveStream = Request.InputStream)
        {
            using (StreamReader readStream = new StreamReader(receiveStream, Encoding.UTF8))
            {
                documentContents = readStream.ReadToEnd();
            }
        }
        return documentContents;
    }
于 2019-10-15T18:56:58.590 回答