2015-06-16 23 views
2

不確定主題是否是此問題的最佳描述,但我遇到了一個不尋常的問題,即在請求中有單個Web API操作和單個字段,並且出於某種奇怪的原因價值被操縱。根據輸入的不同,這些信息會通過Web API或者其他的東西(比如JSON.NET)進行轉換/翻譯?Web API將輸入翻譯爲隨機int

應該提到這是一個全新的項目,除了在Visual Studio中創建新的Web API項目時默認添加的內容外,沒有其他參考。

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

使用其餘客戶I使用以下請求命中操作:

{ 
    "Blah": 43443333222211111117 
} 

當調試布拉赫的值被轉換爲"6549845074792007885"。我不明白如何以及爲什麼這樣做?它尊重的任何其他價值。例如:

{ 
    "Blah": 53443333222211111117 
} 

這是絕對好的,但是是一個更大的數字。

謝謝,DS。

+0

你真的可以有一個API方法返回無效?我看到他們通常返回IHttpResult或HttpResponseMessage?否則,消費者如何知道請求是否確實成功? – qamar

+0

默認情況下沒有內容返回。我也有方法的http post屬性。 –

+0

您是否嘗試在請求標頭中設置正確的內容類型? – qamar

回答

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個字符的緩衝區,爲我的測試用例包含一大堆亂碼,最終數字被錯誤地讀取。我會進一步檢查這個和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; } 
    }