我尝试创建一个简单的控制台应用程序。
我们有一个来自8x8的呼叫系统,该系统提供了网络流API,但它们的文档非常有限,在C#中没有任何内容。
API服务流呼叫状态接近实时,我想获取该"流",并能够在可能的情况下实时阅读和处理。响应或内容类型是"文本/html"。但是,响应的实际主体可以声明为JSON-下面的样本:
{"互动":{" entacteddata":{" entacteddatum":[{" entacteddatakey":"@pri"," entacteddatavalue":100},{" ntacteddatakey":" nacteddatakey":" calleDdatavalue"," calleddatavalue"},{" contacteddatakey":" cha"," contacteddatavalue":999999999999},{" entacteddatakey":" cnt":" cnteddatavalue":0}:0},{"{" ntacteddatakey":" med"," nacteddatavalue":" t"},{" contacteddatakey":" pho"," contacteddatavalue":999999999999},{-01测试"," ResourceType":0}}
我已经看到了有关HTTPCLIENT和GETASYNC方法的几篇文章,但是这些帖子似乎在做出响应时似乎是为了打电话,而不是经常具有响应的内容。
使用提琴手进行调用,它似乎不会关闭,因此流正在不断运行,因此提琴手直到单独的用户或实例连接后才显示任何数据。
当我使用浏览器时,内容被"流"到页面上并自动更新并显示所有内容(如上所述(。
API包含身份验证,因此当另一个客户端连接并检索数据时,连接的客户端关闭,最后我可以看到正在收集的数据。
这是代码,并且当另一个客户连接时确实返回大流,但理想情况下,我想要实时响应,并且似乎只卡在getAsync方法中:
var response = await client.GetAsync(address, HttpCompletionOption.ResponseHeadersRead);
if (response.IsSuccessStatusCode)
{
var responseContent = response.Content;
string responseString = await responseContent.ReadAsStringAsync();
Console.WriteLine(responseString);
}
希望这足以让你们中的一个聪明的人在我的困境中帮助我。
我也遇到了一个问题,这些问题消耗了他们的流媒体API,我发现与Twitter和Couchbase流媒体API一起使用的示例与8x8不起作用。Twitter和Couchbase都会在推动下发送线路终结器,因此解决方案依赖于阅读线来拉动供稿。由于8x8没有发送终止器,因此您需要使用readBlock或更好的readBlockAsync。
以下代码显示了如何使用凭据连接并消耗其提要:
private static async Task StreamAsync(string url, string username, string password)
{
var handler = new HttpClientHandler()
{
Credentials = new NetworkCredential {UserName = username, Password = password},
PreAuthenticate = true
};
// Client can also be singleton
using (var client = new HttpClient(handler))
{
client.Timeout = TimeSpan.FromMilliseconds(Timeout.Infinite);
var request = new HttpRequestMessage(HttpMethod.Get, url);
request.Headers.Connection.Add("keep-alive");
using (var response = await client.SendAsync(
request,
HttpCompletionOption.ResponseHeadersRead))
{
using (var body = await response.Content.ReadAsStreamAsync())
{
using (var reader = new StreamReader(body))
{
while (!reader.EndOfStream)
{
var buffer = new char[1024];
await reader.ReadBlockAsync(buffer, 0, buffer.Length);
Console.WriteLine(new string(buffer));
}
}
}
}
}
}