2014-11-30 2 views
0

나는 꽤 오랜 시간 동안 여기에서 읽었지만이 경우에는 더 이상 익숙하지 않다. 저는 Windows Phone 개발에 익숙하지 않고 다음과 같은 문제에 직면 해 있습니다.C# WP8 async HttpWebRequest XML 요청 메시지로 게시

XML 요청 메시지를 게시해야만 webservice를 호출합니다. 나는 정기적으로 C#에서 작동하는 코드를 가지고

private static string WebRequestPostData(string url, string postData) 
{ 
    System.Net.WebRequest req = System.Net.WebRequest.Create(url); 

    req.ContentType = "text/xml"; 
    req.Method = "POST"; 

    byte[] bytes = System.Text.Encoding.ASCII.GetBytes(postData); 
    req.ContentLength = bytes.Length; 

    using (Stream os = req.GetRequestStream()) 
    { 
     os.Write(bytes, 0, bytes.Length); 
    } 

    using (System.Net.WebResponse resp = req.GetResponse()) 
    { 
     if (resp == null) return null; 
      using (System.IO.StreamReader sr = new System.IO.StreamReader(resp.GetResponseStream())) 
     { 
      return sr.ReadToEnd().Trim(); 
     } 
    } 
} 

(아래 코드 참조) 그러나 윈도우 폰 (8) 개발이 비동기 할 필요가있다.

문자열 결과는 내가하기 위해 노력하고있어 내 요청 XML 메시지의 값이 보낸
private async void DoCallWS() 
{ 
    string url = "<my_url>"; 

     // HTTP web request 
    var httpWebRequest = (HttpWebRequest)WebRequest.Create(url); 
    httpWebRequest.ContentType = "text/xml"; 
    httpWebRequest.Method = "POST"; 

    // Write the request Asynchronously 
    using (var stream = await Task.Factory.FromAsync<Stream>(httpWebRequest.BeginGetRequestStream, 
                   httpWebRequest.EndGetRequestStream, null)) 
    { 
     string requestXml = "<my_request_xml>"; 

     // convert request to byte array 
     byte[] requestAsBytes = Encoding.UTF8.GetBytes(requestXml); 

     // Write the bytes to the stream 
     await stream.WriteAsync(requestAsBytes , 0, requestAsBytes .Length); 

     stream.Position = 0; 
     using (StreamReader reader = new StreamReader(stream, Encoding.UTF8)) 
     { 
      //return reader.ReadToEnd(); 

      string result = reader.ReadToEnd(); 
     } 
    } 
} 

....

: 여기에 주어진 다양한 샘플을 웹을 검색 및 시도 후 나는 다음과 같은 코드에 온

비동기 무효 메서드가 선호되지는 않지만 나중에 해결할 것임을 알고 있습니다. 마티아스 샤피로 (http://matthiasshapiro.com/2012/12/10/window-8-win-phone-code-sharing-httpwebrequest-getresponseasync/)에 의해 설명하지만이

올바른 방향 :

Thnx 프랭크

+1

을 정확하게 귀하의 질문은 무엇 다음과 같이

귀하의 방법을 찾아야한다? 사용중인 코드에 어떤 문제가 있습니까? –

+0

웹 서비스에서 답변을 얻지 못했습니다. reader.ReadToEnd()에 내 요청 매개 변수 의 값이 있습니다. – frankwinder

답변

3
날 지점하시기 바랍니다 충돌 코드를 원인으로

는 또한 솔루션을 다음에 시도했습니다

당신이하고있는 일은 요청 스트림에만 쓰는 것입니다. 응답에서 읽는 코드가 누락되었습니다.

요청 XML을 되 돌리는 이유는 요청 스트림을 재설정하고 정확한 스트림에서 읽을 수 있기 때문입니다.

private async Task DoCallWSAsync() 
{ 
    string url = "<my_url>"; 

    // HTTP web request 
    var httpWebRequest = (HttpWebRequest)WebRequest.Create(url); 
    httpWebRequest.ContentType = "text/xml"; 
    httpWebRequest.Method = "POST"; 

    // Write the request Asynchronously 
    using (var stream = await Task.Factory.FromAsync<Stream>(httpWebRequest.BeginGetRequestStream, 
                  httpWebRequest.EndGetRequestStream, null)) 
    { 
     string requestXml = "<my_request_xml>"; 

     // convert request to byte array 
     byte[] requestAsBytes = Encoding.UTF8.GetBytes(requestXml); 

     // Write the bytes to the stream 
     await stream.WriteAsync(requestAsBytes , 0, requestAsBytes .Length); 
    } 

    using (WebResponse responseObject = await Task<WebResponse>.Factory.FromAsync(httpWebRequest.BeginGetResponse, httpWebRequest.EndGetResponse, httpWebRequest)) 
    { 
     var responseStream = responseObject.GetResponseStream(); 
     var sr = new StreamReader(responseStream); 
     string received = await sr.ReadToEndAsync(); 

     return received; 
    } 
} 
+0

이것은 저에게 적합합니다 !! 덕분에 도움을 많이 받았다. – frankwinder