使用 Owin Self-Host ASP.Net API2 无法接收 POST 正文中包含数据而不是查询字符串的请求

Using Owin Self-Host ASP.Net API2 Can't Receive POST Request with data in body instead of query string

我一直在制作一个机器人来接收来自方舟:生存进化游戏服务器的通知,并将它们发送到使用 Steam 聊天系统的玩家的 Steam 帐户!

好吧,一切都做得很好,没有问题,我使用从查询字符串发送的数据测试了我的工作,它可以正常工作并发送消息等。

但现在我使用游戏服务器检查,它不会工作。

问题似乎来自于发送带有正文内容而不是查询字符串的 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)
    {
    }

创建一个对象来接收正文中的数据:

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

然后当 post 发生时,数据可以更容易地放在请求的正文中。 WebAPI 很难通过 [FromBody] 属性检索多个参数。你可以做到,但它比它值得的更难。

希望对您有所帮助。