【问题标题】:Web API translating input into random intWeb API 将输入转换为随机整数
【发布时间】:2015-06-16 09:07:06
【问题描述】:

不确定该主题是否是此问题的最佳描述,但我遇到了一个不寻常的问题,我有一个 Web API 操作和一个请求字段,并且出于某种奇怪的原因,该值被操纵。根据输入,它会被 Web API 甚至是 JSON.NET 等其他东西转换/翻译?

应该提到这是一个全新的项目,除了在 Visual Studio 中创建新的 Web API 项目时默认添加的内容之外没有其他引用。

public class TestController : ApiController
{
    public void Post(Foo request)
    {
    }
}
public class Foo
{
    public string Blah { get; set; }
}

使用休息客户端,我使用以下请求进行操作:

{
  "Blah": 43443333222211111117
}

在调试时,Blah 的值被转换为"6549845074792007885"。我不明白它是如何以及为什么这样做的?它尊重的任何其他价值。例如:

{
  "Blah": 53443333222211111117
}

这绝对没问题,但数字更大。

谢谢,DS。

【问题讨论】:

  • 你真的可以有一个返回 void 的 api 方法吗?我见过他们通常返回 IHttpResult 或 HttpResponseMessage?否则消费者怎么知道请求是否确实成功?
  • 默认情况下不会返回任何内容。我的方法也有 http post 属性。
  • 您是否尝试在请求标头中设置正确的内容类型?
  • 是的,两个标头都设置为 json。内容类型和另一种我不记得了。
  • 尝试在方法签名中在 Foo 前面附加 frombody 并在发布请求时将内容类型设置为 urlencoded,看看这是否会产生差异

标签: c# post asp.net-web-api json.net


【解决方案1】:

更新

This bug has been fixed and is scheduled to be included in the next release.

原答案

正如所暗示的,这是 JSON.NET 中的一个错误,但并不像最初看起来那么简单。

5.0.4 之前的版本适用于这两个测试用例。之后的任何事情似乎都失败了,但仅限于第一个奇怪的测试用例。我已经浏览了一些 JSON.NET 代码来尝试查看这种混淆发生在哪里,但目前无法弄清楚为什么会这样,我需要做更多的挖掘。

2147483647 最大整数 4444333322221111 有效信用卡号格式 9223372036854775807 Int 64 Max 43443333222211111117 Dodgy Number 大于 Int 64 因此溢出 53443333222211111117 大于上述和 Int 64,但工作异常。 1.7976931348623157E+308。十进制最大值

为什么 53443333222211111117 工作很奇怪。 JSON.NET 似乎预留了一个 1025 字符的缓冲区,其中包含我的测试用例的大量乱码,最终数字被错误地读取。我会进一步检查并raise an issue with JSON.NET

如果您对属性使用小数,这将适用于前导数字不为零的所有情况,但这不是解决方案。短期内使用 5.0.3 版本。

以这个例子程序来演示问题。

class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Sending in: \n43443333222211111117");
            var largeBrokenNumber = JsonConvert.DeserializeObject<Foo>("{\"Blah\": 43443333222211111117 }");
            Console.WriteLine(largeBrokenNumber.Blah);

            Console.WriteLine();

            Console.WriteLine("Sending in: \n53443333222211111117");
            var largeOddWorkingNumber = JsonConvert.DeserializeObject<Foo>("{\"Blah\": 53443333222211111117 }");
            Console.WriteLine(largeOddWorkingNumber.Blah);
        }
    }

    public class Foo
    {
        public string Blah { get; set; }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多