Web API将输入转换为随机int

时间:2015-06-16 09:07:06

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

不确定该主题是否是此问题的最佳描述,但我遇到一个不寻常的问题,即我在请求中有一个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; }
}

使用rest客户端我使用以下请求命中该操作:

{
  "Blah": 43443333222211111117
}

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

{
  "Blah": 53443333222211111117
}

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

谢谢,DS。

1 个答案:

答案 0 :(得分:1)

<强>更新

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

原始答案

这是JSON.NET中的一个提示,但它并不像最初看起来那么简单。

5.0.4之前的版本适用于这两种测试用例。之后的任何事情似乎都失败了,但仅限于第一个奇怪的测试用例。我已经浏览了一些JSON.NET代码,试图看看这种混乱发生的地方,但目前无法解决为什么会出现这种情况,我需要做更多的挖掘。

2147483647                      Int Max
4444333322221111                Valid Credit Card Number Format
9223372036854775807             Int 64 Max
43443333222211111117            Dodgy Number greater than Int 64 hence overflow
53443333222211111117            Larger than above and Int 64, but works oddly.
1.7976931348623157E+308.        Decimal max

为什么53443333222211111117的工作原理很奇怪。 JSON.NET似乎有一个1025字符缓冲区,其中包含一些乱码,我的测试用例,最终错误地读取了数字。我会进一步检查这一点并{{​​3}}。

如果对属性使用小数,这将适用于前导数不为零的所有情况,但这不是一个解决方案。在短期内,请使用版本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; }
    }