如何注册重定向 URL 到 webhook

How to register Redirect URL to webhook

嗨,我一直在努力注册重定向 url 到 Kaizal webhook(它来自微软的聊天应用程序,就像一个 whatsapp),我创建了 asp.net API 控制器来注册它在我的 Kaizala webhook 中。我想要做的是,每当在 Kaizala Group 上创建消息或作业时,我的重定向 url 将捕获数据并将数据保存到我的数据库中。我想我已经满足这里 https://docs.microsoft.com/en-us/kaizala/connectors/webhookvalidaton 的所有要求,我的 Get 方法已经 returning 来自 Header 的 validationToken。但是当我尝试注册我的重定向时总是 return 这个错误 url "message": "Callback URL couldn't be validated. StatusCode = InternalServerError",.

https://kaizala007.blog/2017/12/30/exploring-kaizala-webhooks/comment-page-1/#comment-3776 从这个文档中他说我需要同时支持 get 和 post 方法,已经添加了这两个方法但是我的 post 方法仍然没有做任何事情只是 return statuscode.

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

namespace KaizalaTestApi.Controllers
{

    public class KaizalaCallbackController : ApiController
    {
        // GET: KaizalaCallback
        [HttpGet]
        public string Get()
        {
            string x = Request.Headers.GetValues("validationToken").FirstOrDefault().ToString();
            return x;
        }

        [HttpPost]
        public HttpResponseMessage Post()
        {
            //string validationToken = Request.Headers.GetValues("validationToken").FirstOrDefault().ToString();
            //string data = new StreamReader(Request.Content).ReadToEnd();
            string str = Request.Content.ReadAsStringAsync().Result;

            return Request.CreateResponse(HttpStatusCode.OK);
        }
    }
}

为什么我会收到那个错误?我需要在我的 post 方法中做任何特定的事情才能让它工作吗?

已经找到了如何让它工作,看来我们需要在我们的 get 方法中 return int,我们从查询参数字符串而不是字符串中获取,我使用 asp net core 2.2 来制作我的回调 url。这里看看我的示例代码也保存在数据库中

    [HttpGet]
    public int Get()
    {

        int validationToken = Convert.ToInt32(HttpContext.Request.Query["validationToken"]);

        return validationToken;
    }

    [HttpPost]
    public void Post([FromBody]JObject rawBody)
    {

            using (TheoDBContext db = new TheoDBContext())
            {

                var jsonData = rawBody["data"];
                string name = rawBody["fromUserName"].ToString();
                string title = jsonData["title"].ToString();

                Kaizala newKaizala = new Kaizala();
                newKaizala.Name = name;
                newKaizala.Question = title;
                newKaizala.Answer = "yes";
                db.Kaizala.Add(newKaizala);
                db.SaveChanges();
            }




    }

您 returning int 并不是它起作用的事实。

第一次尝试失败,因为调用时出错

Request.Headers.GetValues("validationToken").FirstOrDefault().ToString();

很可能是空引用异常,因为您试图访问 header 中的令牌,而链接文档指出

Kaizala will generate a validation token and send a GET request to your webhook with a query parameter “validationToken”.

强调我的

的更新使用中被避免
HttpContext.Request.Query["validationToken"]

我建议将语法更新为

[HttpGet]
public IActionResult Get() {
    var validationToken = Request.Query["validationToken"];
    return Content(validationToken);
}

当然你可以重构为预期的查询字符串参数添加验证码。

我提出上述建议是因为不能保证令牌根据文档是有效的 int。即使是这样,如果他们真的不再使用整数作为标记,这种方法也会更加灵活。

要求简单说明

Your service is supposed to return the validation token (received in request) in the response body as a plain-text

有了这个,只有 return 准确发送了。不要尝试对其进行任何更改。