2014-06-16 3 views
1

다음 코드는 윈도우 폰 8.0와 함께 작동하지만, 윈도우 폰에서윈도우 폰 8.1 HTTP 스트림 교착 상태

int nextByte = stream.ReadByte(); 

에 교착 8.1 :

/// <summary> 
    /// Performs a query on the Twitter Stream. 
    /// </summary> 
    /// <param name="request">Request with url endpoint and all query parameters.</param> 
    /// <returns> 
    /// Caller expects an JSON formatted string response, but 
    /// real response(s) with streams is fed to the callback. 
    /// </returns> 
    public async Task<string> QueryTwitterStreamAsync(Request request) 
    { 
     WriteLog(request.FullUrl, "QueryTwitterStreamAsync"); 

     var handler = new HttpClientHandler(); 
     if (Authorizer.Proxy != null && handler.SupportsProxy) 
      handler.Proxy = Authorizer.Proxy; 

     using (StreamingClient = new HttpClient(handler)) 
     { 
      StreamingClient.Timeout = TimeSpan.FromMilliseconds(System.Threading.Timeout.Infinite); 

      var httpRequest = new HttpRequestMessage(HttpMethod.Post, request.Endpoint); 

      var parameters = 
       string.Join("&", 
        (from parm in request.RequestParameters 
        select parm.Name + "=" + Url.PercentEncode(parm.Value)) 
        .ToList());        
      var content = new StringContent(parameters, Encoding.UTF8, "application/x-www-form-urlencoded"); 
      httpRequest.Content = content; 

      var parms = request.RequestParameters 
           .ToDictionary(
            key => key.Name, 
            val => val.Value); 
      SetAuthorizationHeader(HttpMethod.Post, request.FullUrl, parms, httpRequest); 
      httpRequest.Headers.Add("User-Agent", UserAgent); 
      httpRequest.Headers.ExpectContinue = false; 

      if (Authorizer.SupportsCompression) 
       httpRequest.Headers.AcceptEncoding.TryParseAdd("gzip"); 

      var response = await StreamingClient.SendAsync(
       httpRequest, HttpCompletionOption.ResponseHeadersRead).ConfigureAwait(false); 

      await TwitterErrorHandler.ThrowIfErrorAsync(response).ConfigureAwait(false); 

      Stream stream = await CreateStream(response); 

      const int CarriageReturn = 0x0D; 
      const int LineFeed = 0x0A; 
      var memStr = new MemoryStream(); 

      while (stream.CanRead && !IsStreamClosed) 
      { 
       **int nextByte = stream.ReadByte();** 

       if (nextByte == -1) break; 

       if (nextByte != CarriageReturn && nextByte != LineFeed) 
        memStr.WriteByte((byte)nextByte); 

       if (nextByte == LineFeed) 
       { 
        int byteCount = (int)memStr.Length; 
        byte[] tweetBytes = new byte[byteCount]; 

        memStr.Position = 0; 
        await memStr.ReadAsync(tweetBytes, 0, byteCount).ConfigureAwait(false); 

        string tweet = Encoding.UTF8.GetString(tweetBytes, 0, byteCount); 
        var strmContent = new StreamContent(this, tweet); 

        await StreamingCallbackAsync(strmContent).ConfigureAwait(false); 

        memStr.Dispose(); 
        memStr = new MemoryStream(); 
       } 
      } 
     } 

     IsStreamClosed = false; 

     return "{}"; 
    } 

    async Task<Stream> CreateStream(HttpResponseMessage response) 
    { 
     var stream = await response.Content.ReadAsStreamAsync().ConfigureAwait(false); 

     if (Authorizer.SupportsCompression) 
      return new GZipStream(stream, CompressionMode.Decompress); 
     else 
      return stream; 
    } 

이 내 오픈 소스 프로젝트에 LINQ에서입니다 트위터에서 :

http://linqtotwitter.codeplex.com/SourceControl/latest#LinqToTwitterPcl/LinqToTwitter/TwitterExecute.cs

+0

캐싱 기능이있는 [동일한 문제] (http://stackoverflow.com/q/23821821/2681948)가 아닌지 확인하십시오. 전체 파일이 다운로드 될 때까지 단일 바이트를 읽을 수 없었습니다. – Romasz

답변

0

이 더 이상 문제이며, 크게 사건 (OBE)에 의해 점거됩니다. 나는 더 이상 스트리밍 지원을 위해 Windows 8.1을 목표로하지 않고 새로운 Windows.Web.Http.HttpClient을 도입 한 Windows 10으로 이전했습니다. 스트리밍은 새로운 HttpClient를 사용하여 모든 에뮬레이터 및 Windows 10 장치에서 완벽하게 작동합니다.