2011-09-14 2 views
3

내 SL 응용 프로그램에서 Rx를 사용하고 싶습니다. 내 웹 서버에 내 REST 요청에 대한 관찰 가능을 설정하고 싶습니다. Observable.FromEvent 또는 Observable.FromAsync를 연결하는 방법을 알지 못합니다. 최선의 추측은 Webclient 완료가 이벤트를 시작한 다음 Observable.FromEvent를 수행하는 것입니다. 거기에 더 좋은 방법이 있습니까?Silverlight Webclient에서 Rx Observable을 수행하는 방법

+0

+1 나는 어떤 하나처럼 보이는 무엇을 보여보고 싶어요) – AnthonyWJones

답변

3

이제 Rx에서 웹 요청을하는 가장 좋은 방법입니다.

public IObservable<WebResponse> MakeWebRequest(
     Uri uri, 
     Dictionary<string, string> headers = null, 
     string content = null, 
     int retries = 3, 
     TimeSpan? timeout = null) 
{ 
    var request = Observable.Defer(() => 
    { 
     var hwr = WebRequest.Create(uri); 
     if (headers != null) 
     { 
      headers.ForEach(x => hwr.Headers[x.Key] = x.Value); 
     } 

     if (content == null) 
     { 
      return Observable.FromAsyncPattern<WebResponse>(hwr.BeginGetResponse, hwr.EndGetResponse)(); 
     } 

     var buf = Encoding.UTF8.GetBytes(content); 
     return Observable.FromAsyncPattern<Stream>(hwr.BeginGetRequestStream, hwr.EndGetRequestStream)() 
      .SelectMany(x => Observable.FromAsyncPattern<byte[], int, int>(x.BeginWrite, x.EndWrite)(buf, 0, buf.Length)) 
      .SelectMany(_ => Observable.FromAsyncPattern<WebResponse>(hwr.BeginGetResponse, hwr.EndGetResponse)()); 
    }); 

    return request.Timeout(timeout ?? TimeSpan.FromSeconds(15)).Retry(retries); 
} 

는 여기를 사용하는 방법은 다음과 같습니다

MakeWebRequest(new Uri("http://www.google.com")) 
    .Subscribe(
     x => Console.WriteLine("Response is {0}", x), 
     ex => Console.WriteLine("Someone Set Us Up The Bomb: {0}", ex.Message)); 
+0

그게 전부 흡수하는 데 시간이 걸릴 것! – pm100

+0

구현에 대해 걱정하지 마라. 웹 요청을하기 위해 정보를 전달한다는 것을 알고, 결국 하나의 항목 (응답)을 반환하는 IObservable 을 얻게된다. 이 경우 IObservable 은 "미래"와 비슷한 종류의 작업을 나타냅니다.

+0

오류 처리를 포함한 예제 사용 코드를 포함 할 수 있습니까? – AnthonyWJones

관련 문제