2017-04-19 67 views
0

請隨身攜帶新的C#,讓我的腳溼透。C#Web API - 流媒體內容不斷更新8x8流媒體服務

我試圖創建一個簡單的控制檯應用程序。

我們有一個來自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-phone-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

我也有自己的消費流API的問題,我的例子中發現,與Twitter的合作和CouchBase流API的沒有采用8x8工作。 Twitter和CouchBase都在發送行終止符,因此解決方案依賴於ReadLine來提取Feed。由於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)); 
         } 
        } 
       } 
      } 
     } 
    } 
+0

嘿,感謝。 我的問題與他們沒有給我流式傳輸的正確URL相比,他們的在線垃圾文檔相結合。這個讀取塊的快速問題是否會在通話結束時讀取?或者這會在中途切斷通話嗎? – TheNerdyNerd

+0

它會繼續閱讀直到通話結束,除非發生錯誤。只要保持流式傳輸,這將繼續閱讀。我們最終使用了Newtonsoft JsonTextReader而不是閱讀原始流,因此我們可以在每次讀取時獲得謹慎的JSON對象,但概念保持不變。 –