Мне необходимо приложение 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();
}
}
}
У вас экшн контроллера не имеет никаких входных параметров:
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 будут ходить к этому серверу за данными для отображения. При этом есть два варианта:
Более подробно пока не могу сказать. Вы спрашиваете такие крупные куски знаний, что кратко ответить проблематично, кроме того - везде стоят архитектурные выборы, которые вы должны сами сделать и быть готовы к тому, что выбор наугад потом окажется неверным и придётся переделывать.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Есть у меня в игре скины(другая картинка в персонажа) и нужно ,чтобы после выхода игрока из игры его выбор сохранялся(когда он вернется в игру...
У меня есть список под названием matrixКаждый элемент в matrix содержит еще один список под названием Items
Пишу телеграм бота,который должен редактировать картинку пользователя и отправлять ему отредактированный вариантИспользую NuGet пакет Telegram