1

내가 다른 닷넷 플랫폼 8.는 전체 윈도우 폰 8

당신이

을 할 수있는 윈도우 폰에서 완전한하기 전에 응답 스트림에 대한 참조를 얻기 위해 노력하고있다
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

당신은 [이] (HTTP와 같은'WebRequest.GetResponseAsync'을 사용할 수 있습니다 : // 스택 오버플로.com/a/19215782/1768303),'WebResponse.GetResponseStream', 그리고'Stream.ReadAsync'를 호출합니다. – Noseratio

+0

Ive 이미 Stack Overflow 기사를 보았습니다. HttpWebRequest 클래스의 GetResponseAsync 메서드가 Windows Phone 8에 존재하지 않으므로 Windows Phone 8 용으로 작성되지 않았습니다. –

+0

@ZackWeiner 올바른 작업을 수행하는 방법은 무엇입니까? 그게 효과가 없다고 확신합니까? 응답 본문은 얼마나 큽니까? "콘텐츠 스트림 완성"을 아직 기다리고 있음을 어떻게 알 수 있습니까? –

답변

0

여기 거래가 있습니다. 나는 플랫폼의 한계로 인해 당신이 원하는 것을 할 수 없다고 말할 것입니다 ... 그러나 SignalR은 WP 클라이언트를 가지고 있으며 그것을 관리 할 수 ​​있습니다. 따라서 두 가지 옵션이 있습니다 :

1) SignalR 소스 코드를 사용하여 어떻게 작동하는지 확인하십시오. (현재 전화 상으로는 링크를 제공 할 수 없습니다.)

업데이트 :Here is the link. 장기 실행 클라이언트의 경우 Timeout을 -1로 설정하는 것과 같이 꽤 정교한 기법을 사용합니다. 나는 당신이 여기 기술을 확실히 사용해야한다고 생각합니다.

또는

2

) 당신은 강력한 인프라를 가진 크로스 플랫폼 호환되는 이익을 얻을 것 SignalR에 이상 어떻게하든 이동할 수 있습니다.

HTH 내가 무엇을 말할 수에서

+0

비록 SignalR에 익숙하지 않아서 SignalR이 백엔드 서비스와 클라이언트 인 것처럼 보입니다. I.E. 서버 측 구성 요소가 필요합니다. 나는 이미 서버 측 구현을 가지고 있으며, 다른 플랫폼에서도 잘 작동한다 ... 나는 그것을 빨아 들여 소켓을 경청해야 할 수도있다. –

+0

Zack, 방금 링크로 내 의견을 업데이트했습니다. 당신은 SignalR 소스를보아야합니다, 나는 그들이 사용하는 기술이 당신의 문제를 확실히 해결할 것이라고 믿습니다. – AdvancedREI

+0

HttpClient는 커버 아래에서도 Timeout -1 트릭을 사용합니다. HttpWebRequest의 시간 제한 설정은 동기화 요청을 수행 할 때만 올바르게 작동합니다. –

1

, 그것은 바탕 화면에 수행으로 WP8 에뮬레이터에 ResponseHeadersRead 작품.

Win8 SDK가 설치되었습니다. Windows phone 앱을 만들었습니다. 나는이 코드를 MainPage ctor에 추가했다. 이것은 매우 기초적인 긴 폴링 예제를 보여줍니다. 내 호스트 dev에 시스템에서

 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

또한 에뮬레이터를 사용했지만 localhost WebApi에 문제가있어서 새로운 WebApi 프로젝트를 만들었고 get 메소드에서 코드를 삭제하고 실제 웹에 배포했습니다. 경로는 http://www.thepartypedro.com/api/values이며 코드는 제공 한 API 컨트롤러와 동일합니다. 해당 끝점에서도 읽을 수 있는지 확인할 수 있습니까? 그렇다면 Microsoft.Net.Http 빌드 2.2.18도 사용하고 있는지 확인할 수 있습니까? 당신은 또한 오래 실행되지 않는 끝점을 확인할 수 있습니다 @ http://thepartypedro.com/api/values/13 –