這與我的問題HTTPClient Buffer Exceeded 2G; Cannot write more bytes to the buffer有關,但與IMO保證有其他問題不同。NewtonSoft Json無效鑄造異常
在另一個問題,我想弄清楚如何處理打破2G請求緩衝區。這個想法是使用流媒體,但我需要反序列化。在與Google教授交談時,我發現我必須使用TextReader進行流/反序列化。所以我的代碼是:
public async Task<API_Json_Special_Feeds.RootObject> walMart_Special_Feed_Lookup(string url)
{
special_Feed_Lookup_Working = true;
HttpClientHandler handler = new HttpClientHandler()
{
AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate
};
using (HttpClient http = new HttpClient(handler))
{
http.DefaultRequestHeaders.AcceptEncoding.Add(new System.Net.Http.Headers.StringWithQualityHeaderValue("gzip"));
http.Timeout = TimeSpan.FromMilliseconds(Timeout.Infinite);
url = String.Format(url);
using (var response = await http.GetAsync(url, HttpCompletionOption.ResponseHeadersRead))
{
Console.WriteLine(response);
var serializer = new JsonSerializer();
using (StreamReader sr = new StreamReader(await response.Content.ReadAsStreamAsync()))
{
using (var jsonTextReader = new JsonTextReader(sr))
{
API_Json_Special_Feeds.RootObject root = (API_Json_Special_Feeds.RootObject)serializer.Deserialize(jsonTextReader);
return root;
}
}
}
}
}
現在,你可以看到,返回類型是強類型的。該方法的返回類型相匹配。現在,我去呼叫線路:
API_Json_Special_Feeds.RootObject Items = await net.walMart_Special_Feed_Lookup(specialFeedsURLs[i].Replace("{apiKey}", Properties.Resources.API_Key_Walmart));
因此,我們有匹配的類型周圍API_Json_Special_Feeds.RootMethod一路。
運行時,呼叫線路引發InvalidCastException:
令人失望的結果:
Unable to cast object of type 'Newtonsoft.Json.Linq.JObject' to type 'RootObject'
我已經在方法返回之前結束時檢查,結果確實是從投一個對象返回之前返回API_Json_Special_Feeds.RootMethod。
問題:某處return語句和主叫用戶線之間,被返回的對象正在從一個API_Json_Special_Feeds.RootMethod到Newtonsoft.Json.Linq.JObject轉換。我無法調試它,因爲它們之間沒有代碼。如果我再次在調用行中投射,則會出現「無法投射」錯誤。我怎樣才能防止這種對象類型的退化/改變?
許多人認爲你的時間,考慮和任何想法或建議,你可以提供!
謝謝!到目前爲止,這不起作用。我試圖找出它卡住的位置,並將回報。沒有錯誤 - 加載響應並從不返回任何內容 –