Как отправить данные из WebHook в WinForm?

96
16 марта 2021, 07:30

Мне необходимо приложение WinForm, которое будет клиентом для Viber.
Я создал WebHook, который принимает POST запросы от сервера Viber.
POST запрос содержит JSON.
WebHook создан из шаблона ASP.NET Framework "Пустой" + "MVC".

Вопрос.
1. Как сделать, чтобы если WebHook получает POST запрос, то полученный JSON отправлялся в "WinForm"?
2. Если данное решение не приемлемо, то как правильно организовать передачу данных из WebHook в WinForm в рамках другого решения?

Код HookController.cs

 using System.Web.Mvc;
using System.IO;
namespace WebAppl.Controllers
{
    public class HookController : Controller
    {
        // *** Original code ***
        // GET: Hook
        //public ActionResult Index()
        //{
        //    return View();
        //}
        [HttpPost]
        public string Index()
        {
            using (var reader = new StreamReader(Request.InputStream))
                return reader.ReadToEnd();
        }
    }
}

Answer 1

У вас экшн контроллера не имеет никаких входных параметров:

public string Index()

Поэтому вы работаете с сырым запросом. Судя по документации туда POST'ом приходит некоторый json

Поэтому вы можете описать это следующим образом, чтобы сразу работать с объектом, а не с json:

public string Index([FromBody] ViberRequest request)

И использовать ваш request как вам нужно - json будет преобразован в объект.

Класс будет что-то вида:

public class ViberRequest
{
    public string send_name { get; set; }
    ...
}

(Класс ViberRequest можете получить при помощи онлайн-сервиса https://app.quicktype.io/#r=json2csharp )

По-хорошему пришедшие сообщения стоит сложить в базу, откуда их и будет доставать по мере необходимости ваш клиент (ваше winforms приложение). Просто пришедшие при помощи вебхука сообщения приходят единоразово, перезапустите своё приложение - и ничего из ранее полученных сообщений не увидите.

В вашем же варианте вы читаете сообщение и отдаёте его обратно серверу вайбера, а оно ему не нужно, ему достаточно просто получить HTTP 200 OK как подтверждение что вы обработали сообщение. (При неуспешных попытках типа 500, 503 сообщения могут быть переотправлены - точно не уверен за вайбер, но вот телеграм хук так точно делает несколько раз)

Нужно же понимать, что на одном хосте вы вряд ли сможете держать запущенным winform приложение и asp.net сайт - только разве что в случае если у вас машина будет торчать в интернет. (Для вебхука нужно указывать адрес сети в интернете). Поэтому какие-то варианты типа "кидать event в winform приложение и перерисовывать по приходу события интерфейс будут скорее чисто теоретическими.

Вопрос-3.

... ему достаточно просто получить HTTP 200 OK ... Как это сделать?

Просто отдайте пустую строку.

Вопрос-4.*

Если проект (WebAppl + WinFor)(см. скрин вопроса) располагается в одном решении (на компе Win7), то как заупстить WebAppl из WinFor? Т.е. запускаю WinFor, а WebAppl запускается автоматически

Нда. Кратко: никак, ознакомьтесь с вариантами развёртывания asp.net core веб-приложений, там такой версии нет. Либо IIS, либо self-хост, либо облако azure... но проблема даже не техническая - а архитектурная.

Я пожалуй дополню ответ, поскольку видно что вы не понимаете именно как это будет работать в системе.

Сервер вайбера при получении какого-то сообщения (допустим с сотового) может обратиться к какому-то публичному серверу стоящему в интернете. Но к одному. И к - публичному. Ваше приложение winforms скорее всего будет стоять за NAT провайдера, а если вы пишете winforms приложение, которое будет развёрнуто на нескольких машинах одновременно - то тем более нельзя полагаться на то, что у вас машина с веб-сервером будет на том же месте, что и машина с winforms-приложением(приложениями).

(Не, я чисто гипотетически знаю, что вы можете пробросить порты и выставить машину с winforms в интернет, дать ей DNS-имя - но я не уверен, что вряд ли этот то, что вы хотите сделать. А может и хотите - но вы как-то пока идёте наощупь и сами вряд ли понимаете, что именно в хотите)

Итого, у вас будет некоторый сервер в интернете, к которому будет обращаться вайбер. Там же будет и SQL-сервер, куда вы сохраните сообщения.

А уже машина/машины с winforms будут ходить к этому серверу за данными для отображения. При этом есть два варианта:

  • вы можете сделать другое webapi для получения данных
  • вы можете использовать connection string и идти напрямую к базе

Более подробно пока не могу сказать. Вы спрашиваете такие крупные куски знаний, что кратко ответить проблематично, кроме того - везде стоят архитектурные выборы, которые вы должны сами сделать и быть готовы к тому, что выбор наугад потом окажется неверным и придётся переделывать.

READ ALSO
Валидация xml файла

Валидация xml файла

Есть xml файлЕго необходимо проверить согласнo схеме XSD

109
Как сделать запоминание выбора игрока

Как сделать запоминание выбора игрока

Есть у меня в игре скины(другая картинка в персонажа) и нужно ,чтобы после выхода игрока из игры его выбор сохранялся(когда он вернется в игру...

105
Фильтр списка в списке

Фильтр списка в списке

У меня есть список под названием matrixКаждый элемент в matrix содержит еще один список под названием Items

111
Как отправить пользователю изображение через телеграм бота используя загрузку файла с помощью запроса HTTP?

Как отправить пользователю изображение через телеграм бота используя загрузку файла с помощью запроса HTTP?

Пишу телеграм бота,который должен редактировать картинку пользователя и отправлять ему отредактированный вариантИспользую NuGet пакет Telegram

90