【问题标题】:Streaming Content constantly updating 8x8 streaming service流媒体内容不断更新 8x8 流媒体服务
【发布时间】:2017-09-16 06:59:26
【问题描述】:

我尝试创建一个简单的控制台应用程序。

我们有一个来自 8x8 的调用系统,它提供了一个 Web 流 API,但它们的文档非常有限,而且 C# 中没有任何内容。

api 服务流近乎实时地调用状态,我希望获得该“流”并能够在可能的情况下实时读取和处理它。响应或内容类型为“text/html”。但是响应的实际正文可以声明为 json - 示例如下:

{"交互":{"attachedData":{"attachedDatum":[{"attachedDataKey":"@pri","attachedDataValue":100},{"attachedDataKey":"callingName","attachedDataValue":999999999999 },{"attachedDataKey":"cha","attachedDataValue":99999999999},{"attachedDataKey":"cnt","attachedDataValue":0},{"attachedDataKey":"con","attachedDataValue":0}, {"attachedDataKey":"med","attachedDataValue":"T"},{"attachedDataKey":"pho","attachedDataValue":9999999999},{"attachedDataKey":"phoneNum","attachedDataValue":9999999999}, {"attachedDataKey":"tok","attachedDataValue":999999999}]},"event":"InteractionCreated","inboundChannelid":9999999999,"interactionEventTS":9999999,"interactionGUID":"int-15b875d0da2-DJOJkDhDsrh3AIaFP8VkICv9t-phone -01-testist","re​​sourceType":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);
            }

希望这些信息足以让你们中的一个聪明人帮助我摆脱困境。

【问题讨论】:

    标签: c# web-services api asp.net-web-api stream


    【解决方案1】:

    我在使用他们的流式 API 时也遇到了问题,我发现使用 Twitter 和 CouchBase 流式 API 的示例不适用于 8x8。 Twitter 和 CouchBase 在它们的推送中都发送行终止符,因此该解决方案依赖于 ReadLine 来拉入提要。由于 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));
                            }
                        }
                    }
                }
            }
        }
    

    【讨论】:

    • 您好,谢谢。与他们的在线垃圾文档相比,我的问题与他们没有给我正确的流媒体 URL 的事实相结合。这个读取块的一个快速问题是读取到调用结束吗?或者这会在中途中断通话吗?
    • 除非发生错误,否则它将继续读取直到调用结束。只要他们继续流式传输,这将继续阅读。我们最终使用了 Newtonsoft JsonTextReader 而不是读取原始流,因此我们可以在每次读取时获得谨慎的 JSON 对象,但概念保持不变。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-20
    • 1970-01-01
    • 1970-01-01
    • 2014-04-12
    • 1970-01-01
    • 2014-09-11
    • 2020-12-05
    相关资源
    最近更新 更多