Как зарегистрироваться Перенаправить URL на webhook - PullRequest
0 голосов
/ 16 января 2019

Привет, я изо всех сил пытался зарегистрировать URL перенаправления на веб-крючок Kaizal (его приложение для чата от Microsoft, например, WhatsApp), я создал asp.net API Controller, чтобы зарегистрировать его в своем веб-крюке Kaizala. Что я хочу сделать, так это то, что когда в Kaizala Group создается сообщение или задание, мой URL перенаправления будет собирать данные и сохранять их в моей базе данных. Я думаю, что я уже отвечаю всем требованиям отсюда https://docs.microsoft.com/en-us/kaizala/connectors/webhookvalidaton, мой метод Get уже возвращает validationToken из заголовка. Но он всегда возвращает эту ошибку, когда я пытаюсь зарегистрировать свой 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 по-прежнему ничего не делает, просто возвращает код статуса.

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);
        }
    }
}

Почему я получаю эту ошибку? мне нужно сделать какую-то конкретную вещь в моем методе сообщения, чтобы иметь возможность сделать это работает?

Ответы [ 2 ]

0 голосов
/ 21 января 2019

Не факт, что вы возвращаете int, что это сработало.

Первая попытка не удалась из-за ошибки при вызове

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

Скорее всего, исключение нулевой ссылки, потому что вы пытались получить доступ к токену в заголовке, в то время как в связанной документации указано

Kaizala сгенерирует токен проверки и отправит GET-запрос вашему веб-крюку с параметром запроса «validationToken».

упорная мина

, который был исключен в обновленной версии

HttpContext.Request.Query["validationToken"]

Я бы предложил обновить синтаксис до

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

Конечно, вы можете выполнить рефакторинг, чтобы добавить код проверки для ожидаемого параметра строки запроса.

Я предлагаю выше, потому что нет никакой гарантии, что токен будет действительным int на основании документации. И даже если это так, этот подход был бы более гибким, если бы они когда-либо отказались от использования целых чисел в качестве токенов.

В требованиях просто говорится

Ваша служба должна вернуть токен проверки (полученный в запросе) в теле ответа в виде простого текста

При этом верните только то, что отправлено. Не пытайтесь вносить в него какие-либо изменения.

0 голосов
/ 21 января 2019

Уже нашли, как заставить это работать, кажется, что нам нужно вернуть int в нашем методе get, который мы получаем из строки параметров paramst вместо строки, я использовал 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();
            }




    }
...