Использование собственного хоста Owin ASP.Net API2 не может получить запрос POST с данными в теле вместо строки запроса

Я делал бота, чтобы получать уведомления от игрового сервера Ark: Survival Evolved и отправлять их на учетную запись Steam игрока, используя систему Steam Chat!

ну, все было сделано без проблем, я проверил свою работу, используя данные, отправленные из строки запроса, и она работает и отправляет сообщения и т. д.

но теперь, когда я проверяю, используя игровой сервер, он не будет работать.

Проблема, кажется, исходит от отправки HTTP-запроса POST с содержимым тела вместо строки запроса, так как мое приложение не получит их.

Я сделал много примеров для получения запросов POST, но, похоже, не работает, я надеюсь, что кто-то здесь знает, как это исправить, я потерял всякую надежду, работая над этим более 5 часов, и даже спросил об этом в C# SOChat,

Вот мой код: https://github.com/LuckyPed/Ark-Steam-Notifier-Console/blob/Post-Data/ArkSteamNotifier/ValuesController.cs

Ни один из них, кажется, не работает:

    public void Post1(string key, ulong steamid, string notetitle, string message)
    {
        if (!Program.settings.UnSub.Contains(steamid))
        {
            SteamID SID = new SteamID(steamid);
            Program.steamFriends.SendChatMessage(SID, EChatEntryType.ChatMsg, System.DateTime.UtcNow + " UTC ( GMT ) : " + notetitle);
            Thread.Sleep(1000);
            Program.steamFriends.SendChatMessage(SID, EChatEntryType.ChatMsg, message);
        }
    }

    public void Post([FromBody]string key,[FromBody]ulong steamid,[FromBody]string notetitle,[FromBody]string message)
    {
        if (!Program.settings.UnSub.Contains(steamid))
        {
            SteamID SID = new SteamID(steamid);
            Program.steamFriends.SendChatMessage(SID, EChatEntryType.ChatMsg, System.DateTime.UtcNow + " UTC ( GMT ) : " + notetitle);
            Thread.Sleep(1000);
            Program.steamFriends.SendChatMessage(SID, EChatEntryType.ChatMsg, message);
        }
    }

    public class MyFormData
    {
        public string Data { get; set; }
    }

    public void Post([FromBody]MyFormData formData)
    {
    }

    public void Post([FromBody]MyData formData)
    {
    }

    public class MyData
    {
        public string key { get; set; }
        public string steamid { get; set; }
        public string message { get; set; }
        public string notetitle { get; set; }
    }

    public void Post(string value)
    {
    }

    public void Post1([FromBody]string value)
    {
    }

1 ответ

Решение

Создайте объект для получения данных в теле:

public class SteamData
{
    public string Key {get; set;}
    public ulong SteamId {get; set;}
    public string NoteTitle {get; set;}
    public string Message {get;set;}
}

Затем поменяй Post метод как это:

public void Post([FromBody] SteamData data)
{
    if (!Program.settings.UnSub.Contains(steamid))
    {
        SteamID SID = new SteamID(data.SteamId);
        Program.steamFriends.SendChatMessage(SID, EChatEntryType.ChatMsg, System.DateTime.UtcNow + " UTC ( GMT ) : " + data.NoteTitle);
        Thread.Sleep(1000);
        Program.steamFriends.SendChatMessage(SID, EChatEntryType.ChatMsg, data.Message);
    }
}

Затем, когда происходит сообщение, данные могут быть легче в теле запроса. WebAPI испытывает трудности при получении более одного параметра с атрибутом [FromBody]. Вы можете сделать это, но это сложнее, чем оно того стоит.

Надеюсь, это поможет.

Другие вопросы по тегам