我试图创建一个简单的控制台应用程序。
我们有一个8x8的呼叫系统,它提供了一个网络流API,但他们的文档非常有限,C#中没有。
api服务近乎实时地传输呼叫状态,我希望得到“流”,并且如果可能的话,能够实时读取和处理它。响应或内容类型为“text / html”。但是响应的实际主体可以声明为json - 示例如下:
{ “相互作用”:{ “attachedData”:{ “attachedDatum”:[{ “attachedDataKey”: “@ PRI”, “attachedDataValue”:100},{ “attachedDataKey”: “callingName”, “attachedDataValue”:999999999999 },{ “attachedDataKey”: “茶”, “attachedDataValue”:99999999999},{ “attachedDataKey”: “CNT”, “attachedDataValue”:0},{ “attachedDataKey”: “CON”, “attachedDataValue”:0}, { “attachedDataKey”: “配有”, “attachedDataValue”: “T”},{ “attachedDataKey”: “PHO”, “attachedDataValue”:9999999999},{ “attachedDataKey”: “PHONENUM”, “attachedDataValue”:9999999999} { “attachedDataKey”: “TOK”, “attachedDataValue”:999999999}]}, “事件”: “InteractionCreated”, “inboundChannelid”:9999999999, “interactionEventTS”:9999999, “interactionGUID”:“INT-15b875d0da2-DJOJkDhDsrh3AIaFP8VkICv9t电话-01-testist”, “resourceType为”:0}}
我已经看过几篇关于httpClient和GetAsync方法的帖子,但是这些方法似乎都不起作用,因为它们在做出响应时似乎是用于调用的,而不是经常有响应的。
使用fiddler进行调用它似乎不会关闭,因此流不断运行,因此在单独的用户或实例连接之前,fiddler不会显示任何数据。
当我使用浏览器时,内容会“流式传输”到页面并自动更新并显示所有内容(如上所述)。
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);
}
希望有足够的信息让你们中的一个聪明的人帮助我摆脱困境。
答案 0 :(得分:1)
我也遇到了使用他们的流API的问题,我发现使用Twitter和CouchBase流API的例子不适用于8x8。 Twitter和CouchBase都会在推送中发送行终止符,因此解决方案依赖于ReadLine来提取订阅源。由于8x8不发送终结符,因此您需要使用ReadBlock或更好的ReadBlockAsync。
以下代码显示了如何使用凭据进行连接并使用其Feed:
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));
}
}
}
}
}
}