【问题标题】:Using Owin Self-Host ASP.Net API2 Can't Receive POST Request with data in body instead of query string使用 Owin Self-Host ASP.Net API2 Can't Receive POST Request with data in body instead of query string
【发布时间】:2016-11-17 21:42:22
【问题描述】:

我一直在制作一个机器人来接收来自 Ark: Survival Evolved 游戏服务器的通知并将它们发送到使用 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)
    {
    }

【问题讨论】:

  • 当你说这不起作用时,你遇到了什么问题?
  • 当游戏服务器发送 POST 时,我没有在应用程序上收到它。但有了 Fiddler,我可以确保正在制作 POST:prntscr.com/bswyme
  • 啊,您的控制器中同时拥有所有这些Post 操作?这可能会触发 Web API,因为它不知道为该请求选择哪一个。
  • 好的,我会尽快尝试这样做并再次逐个检查,一开始只是第一个,然后我一个接一个地添加 1 进行测试。
  • 我不敢相信它真的有效!我只是照我做的,@MichaelDotKnox 也说过,但删除了所有其余的!它得到了修复....哇这么多时间花在这个上:D谢谢男人

标签: c# asp.net post owin self-hosting


【解决方案1】:

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

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] 属性检索多个参数。你可以做到,但它比它的价值更难。

希望对您有所帮助。

【讨论】:

  • 我实际上已经这样做了,它写在下面,它是公共类 MyData 和 Post([FromBody]MyData formData) ,你可以看到我以不同的方式制作了几个公共 void Post,但我做了给他们一个断点,他们都没有受到打击:(
  • @Pedram 问题可能是您在控制器中有很多尝试。清理它,使其具有像@MichaelDotKnox 描述的单个“发布”操作,看看它是否有效。顺便说一句,在这种情况下,您甚至不需要 [FromBody] 属性。
  • 是的,它是这样工作的,我的问题是同时有这么多帖子。
猜你喜欢
  • 1970-01-01
  • 2022-12-28
  • 2017-04-23
  • 1970-01-01
  • 2022-12-04
  • 2021-11-11
  • 2020-07-07
  • 1970-01-01
  • 2022-12-01
相关资源
最近更新 更多