【发布时间】:2021-06-21 16:14:01
【问题描述】:
我正在尝试使用.Net Core 3.1 构建一个简单的 twitter HttpClient 和 MySQL 应用程序,但我看到了一个问题,即在我完成处理之前结果对象变为空。处理这个问题的正确方法应该是什么?
示例代码:
using (HttpClient httpClient = new HttpClient())
{
httpClient.Timeout = TimeSpan.FromMilliseconds(Timeout.Infinite);
var requestUri = "https://api.twitter.com/2/tweets/search/stream";
httpClient.DefaultRequestHeaders.Add("Authorization", "Bearer <token>");
var stream = httpClient.GetStreamAsync(requestUri).Result;
using (var reader = new StreamReader(stream))
{
//while (!reader.EndOfStream)
while (reader.Peek() >= 0)
{
//We are ready to read the stream
var ResultObject = JsonConvert.DeserializeObject<Tweet>(reader.ReadLine());
Console.WriteLine(ResultObject);
if (ResultObject != null) // <== ResultObject disappears after this :: NullReferenceException
{
Console.WriteLine(ResultObject);
string sQuery = $"INSERT INTO MySQLTable (tweet_id,text) VALUES ({ResultObject.data.id},\"{ResultObject.data.text}\");";
Client.NonQuery(sQuery);
Console.WriteLine(Client.Query("SELECT * FROM MySQLTable;"));
};
}
}
}
public class Tweet
{
public TweetData data;
}
public class TweetData
{
public string id;
public string text;
}
(这个问题在.Net 5.0没有出现)
【问题讨论】:
-
尝试将
await添加到httpClient.GetStreamAsync(requestUri)并使方法异步docs.microsoft.com/en-us/dotnet/csharp/programming-guide/… -
你为什么要逐行阅读响应并分别反序列化? JSON 不是基于行的格式。
-
@madreflection Twitter“search/stream”端点似乎由以换行符结尾的字符串组成,除非我错了。 (这纯粹是基于 .net 5.0 结果完美地使用完全相同的代码)
-
@AndrewE 不会添加 await 只是让程序永远挂起,因为我们收到了无穷无尽的流?
标签: c# .net-core nullreferenceexception streamreader