1

我想之前其完整的去響應流的引用在Windows Phone的8內容流之前讀取HTTP流的內容是完整的Windows Phone 8

在其他.NET平臺上,你可以做

HttpWebRequest httpRequest = (HttpWebRequest)WebRequest.Create(myUri); 
WebResponse subscribeWebResponse = null; 
Stream subscribeStream = null; 

subscribeWebResponse = httpRequest.GetResponse(); 
subscribeStream = subscribeWebResponse.GetResponseStream(); 

爲了創建可移植類庫,我使用了nuget的HttpClientLibrary。

這增加了裁判的擴展組件Microsoft.Net.Http

這使我回到當時的異步請求的頭已經被閱讀的,而不是等待內容傳輸是完整的

var clientResponse = await httpClient.SendAsync(requestmessage, HttpCompletionOption.ResponseHeadersRead); 

我遇到的問題是,在Windows Phone 8中它不能正常工作,並仍然等待內容流返回的完成。

此外

await httpWebRequest.BeginGetResponse(callback, request) 

具有相同的行爲,因爲這些異步方法實際上是在等待網頁的響應,繼續執行完畢。

那麼,有沒有什麼辦法來實現返回的響應/流在我已經收到沒有Microsoft.Http.Net包的響應頭? 即使它必須是Windows Phone 8平臺特定解決方案? 可能是HttpWebRequest的擴展?

+0

你可以使用'WebRequest.GetResponseAsync'像[這裏](HTTP://堆棧溢出。com/a/19215782/1768303),然後'WebResponse.GetResponseStream',然後'Stream.ReadAsync'。 – Noseratio

+0

我已經看到堆棧溢出的文章。它不是爲Windows Phone 8編寫的,因爲Windows Phone 8中不存在用於HttpWebRequest類的GetResponseAsync方法。 –

+0

@ZackWeiner你在做什麼是正確的做法。你確定它不工作?你的迴應機構有多大?你怎麼知道它仍在等待「完成內容流」? –

回答

0

所以這裏是交易。由於平臺限制,我想說你想做的事情是不可能的......但是SignalR有一個WP客戶端並且能夠管理它。所以在我看來,你有兩種選擇:

1)挖掘到SignalR源代碼,看看他們是如何做到的(我現在在我的手機上,所以我不能提供鏈接)。

更新:Here is the link。他們做一些漂亮的技巧,比如將Timeout設置爲-1以適應長時間運行的客戶端。我認爲你應該使用這裏的技術。

OR

2)您可以將你在做什麼到SignalR,其將獲得具有強大的基礎設施,併爲跨平臺兼容的好處。

HTH

+0

雖然我不熟悉SignalR,但看起來好像SignalR是後端服務和客戶端。 I.E.你需要一個服務器端組件。我已經有了服務器端的實現,並且它在其他平臺上運行良好......我可能只需要將其吸收並通過套接字進行監聽。 –

+0

Zack,我只是用鏈接更新了我的評論。你應該看看SignalR的來源,我相信他們使用的技術一定會解決你的問題。 – AdvancedREI

+0

HttpClient也在封面下使用超時-1技巧。在HttpWebRequest中設置超時只能在執行同步請求時正常工作。 –

1

從我可以告訴,ResponseHeadersRead工程作爲它在桌面上的WP8模擬器。

我安裝了Win8 SDK。創建了一個Windows Phone應用程序。我將此代碼添加到MainPage ctor。這表明了一個非常基本的長投票例子。

 var client = new HttpClient(); 

     var request = new HttpRequestMessage() 
     { 
      RequestUri = new Uri("http://oak:1001/longpolling") 
     }; 
     client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead, new CancellationToken()) 
      .ContinueWith((t) => 
      { 
       var response = t.Result; 
       response.Content.ReadAsStreamAsync() 
        .ContinueWith(s => 
        { 
         var st = s.Result; 
         while (true) 
         { 
          var message= ReadNextMessage(st); 
         } 
        });  
      }); 
    } 
    private static string ReadNextMessage(Stream stream) 
     { 
      int chr = 0; 
      string output = ""; 
      while (chr != 10) 
      { 
       chr = stream.ReadByte(); 
       output += Convert.ToChar(chr); 
      } 
      return output; 
    } 

在我的主機開發機我有一個控制器,它看起來像這樣一個網頁API ...

public class LongPollingController : ApiController 
    { 
     public HttpResponseMessage Get() 

     { 
      Thread.Sleep(2000); 
      var content = new PushStreamContent((s,c,t) => 
      { 
       int i = 0; 
       while (true) 
       { 
        try 
        { 
         var message = String.Format("The current count is {0} " + Environment.NewLine, i++); 
         var buffer = Encoding.UTF8.GetBytes(message); 
         s.Write(buffer, 0, buffer.Length); 
        } 
        catch (IOException exception) 
        { 
         s.Close(); 
         return; 
        } 
        Thread.Sleep(1000); 
       } 
      }); 
      return new HttpResponseMessage(HttpStatusCode.OK) 
      { 
       RequestMessage = Request, 
       Content = content 
      }; 
     } 
    } 
+0

你真的能夠讀取流?我將這段代碼彈出到一個示例應用程序中,並將其修改爲連接到我的實時SSE服務器,並且我可以看到執行繼續超越了SendAsync,因爲我在下一行執行時有一個簡單的字符串值賦值......但Continuation1似乎只在發生錯誤的情況下執行,而不是在建立連接並將數據發送到管道時執行......因此,Continuation2和ReadNextMessage()永遠不會觸發。我可以使用Fiddler的CommetPeek函數(右鍵單擊打開的連接)驗證數據是否正在連接。 –

+0

我能夠讀取流很好。然而,這只是在模擬器中。我還沒有手機開發者帳戶設置,因此我無法在真實硬件上進行測試。 –

+0

即時通訊也使用模擬器,但本地主機WebApi有問題,所以我創建了一個新的WebApi項目,將你的代碼放在get方法中並將其發佈到真正的交易萬維網上。路由是http://www.thepartypedro.com/api/values,代碼與您提供的api控制器相同,您是否可以確認可以讀取該終端?如果是這樣,我們可以確認您也使用Microsoft.Net.Http build 2.2.18?你也可以確認沒有長時間運行的獲得端點@ http://thepartypedro.com/api/values/13 –