0

은 멍청한 소리가 날 수도 있지만,이 문제는 실제로 내 마음에서 벗어나지 않습니다. Windows Phone 8.1과 관련된 이상한 문제가 있습니다. 게이트웨이 서버와 통신하고 요청 된 데이터를 처리하는 Windows Phone 8 용 응용 프로그램을 개발했습니다. 우리는 HttpClient를 사용하여 게이트웨이 서버로 데이터를 보내고받습니다. 그러나 몇 가지 이유 때문에 Windows Phone 8 OS를 Windows Phone 8.1로 업그레이드했지만 이제는 게이트웨이 서버와 통신 할 때마다 요청을 처리하지 않습니다.HttpClient with Windows Phone 8.1

그러나 Windows 8.1 에뮬레이터에서는 정상적으로 작동하지만 실제 Windows Phone 8.1 장치 (이전에 Windows Phone 8.0 OS에서 업그레이드)에 응용 프로그램을 배포하면 작동하지 않습니다.


var response = await RequestUtility.SendHttpRequest(myUri, httpMethod, stream, "text/xml", null, null, 0); Windows Phone 8.1에서이 응용 프로그램을 실행할 때마다 항상 응답에 0 바이트가 포함됩니다. 여기

는 서버

public async Task<bool> ValidateUserRequest(User user) 
     { 
      var result = false; 
      var myUri = new Uri(GatewayUrl); 
      var content = RequestUtility.ValidateRequestBuilder(user); 
      try 
      { 
       var httpMethod = new HttpMethod("POST"); 
       MemoryStream stream = new MemoryStream((new UTF8Encoding()).GetBytes(content.ToString(CultureInfo.InvariantCulture))); 
       var response = await RequestUtility.SendHttpRequest(myUri, httpMethod, stream, "text/xml", null, null, 0); 
       string ecodedString = Encoding.UTF8.GetString(response, 0, response.Length); 
       var serializer = new XmlSerializer(typeof(ResponseType)); 
       ResponseType responseObject; 
       using (var reader = new StringReader(ecodedString)) 
       { 
        responseObject = serializer.Deserialize(reader) as ResponseType; 
       } 
       if (responseObject != null) result = responseObject.Approved; 
      } 
      catch 
      { 
       result = false; 
      } 
      return result; 
     } 

요청 유틸리티 코드 조각

public static async Task<byte[]> SendHttpRequest(Uri uri, HttpMethod method, Stream requestContent = null, string contentType = null, HttpClientHandler clientHandler = null, Dictionary<string, string> headers = null, int timeoutInSeconds = 0) 
     { 

      var req = clientHandler == null ? new HttpClient() : new HttpClient(clientHandler); 
      var message = new HttpRequestMessage(method, uri); 
      byte[] response; 
      if (requestContent != null && (method == HttpMethod.Post || method == HttpMethod.Put || method == HttpMethod.Delete)) 
      { 
       message.Content = new StreamContent(requestContent); //set the body for the request 

       if (!string.IsNullOrEmpty(contentType)) 
       { 
        message.Content.Headers.Add("Content-Type", contentType); // if the request has a body set the MIME type 

       } 
      } 

      // append additional headers to the request 
      if (headers != null) 
      { 
       foreach (var header in headers) 
       { 
        if (message.Headers.Contains(header.Key)) 
        { 
         message.Headers.Remove(header.Key); 
        } 

        message.Headers.Add(header.Key, header.Value); 
       } 
      } 
      // Send the request and read the response as an array of bytes 
      if (timeoutInSeconds > 0) 
      { 
       req.Timeout = new TimeSpan(0, 0, timeoutInSeconds); 
      } 
      using (var res = await req.SendAsync(message)) 
      { 
       response = await res.Content.ReadAsByteArrayAsync(); 
      } 
      return response; 
     } 

어떤 생각 통신 코드를 무엇입니까? 귀하의 아이디어/제안은 높이 평가됩니다.

+0

에뮬레이터에서는 작동하지만 장치가 아닌 경우에는 무엇이 다를 수 있는지 확인할 것입니다. 전화가 제대로 업그레이드 되었습니까? 다른 연결 문제가 있습니까? 새로운 프로젝트를 만들고 HttpRequest를 테스트 해 보셨습니까? – earthling

+0

같은 문제가 있습니다. 내 코드는 Windows 8.1에서는 좋지만 Windows Phone 8.1 (빈 응답 콘텐츠)에서는 작동하지 않습니다.> 이 문제를 해결해 봤습니까? – Geotinc

답변

0

내가 서버에 간단한 요청을 할 때까지의 HttpWebRequest와 HttpWebResponse 클래스 클래스를 사용하는 prefert, 이것을 사용 :

private async Task<string> DoRequest(string Type, string Device, string Version, string Os) 
    { 
     //Declarations of Variables 
     string result = ""; 

     HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); 
     request.ContinueTimeout = 4000; 

     request.Credentials = CredentialCache.DefaultNetworkCredentials; 

     //Add headers to request 
     request.Headers["Type"] = Type; 
     request.Headers["Device"] = Device; 
     request.Headers["Version"] = Version; 
     request.Headers["Os"] = Os; 
     request.Headers["Cache-Control"] = "no-cache"; 
     request.Headers["Pragma"] = "no-cache"; 

     using (HttpWebResponse response = (HttpWebResponse)await request.GetResponseAsync()) 
     { 
      if (response.StatusCode == HttpStatusCode.OK) 
      { 
       //To obtain response body 
       using (Stream streamResponse = response.GetResponseStream()) 
       { 
        using (StreamReader streamRead = new StreamReader(streamResponse, Encoding.UTF8)) 
        { 
         result = streamRead.ReadToEnd(); 
        } 
       } 
      } 
     } 

     return result; 
    } 

그리고 다운로드 파일을이를 사용

private void DoSincroFit() 
    { 
     HttpWebRequest request = HttpWebRequest.CreateHttp(url); 

     //Add headers to request 
     request.Headers["Type"] = "sincrofit"; 
     request.Headers["Device"] = "1"; 
     request.Headers["Version"] = "0.000"; 
     request.Headers["Os"] = "WindowsPhone"; 
     request.Headers["Cache-Control"] = "no-cache"; 
     request.Headers["Pragma"] = "no-cache"; 

     request.BeginGetResponse(new AsyncCallback(playResponseAsync), request); 
    } 

    public async void playResponseAsync(IAsyncResult asyncResult) 
    { 
     //Declaration of variables 
     HttpWebRequest webRequest = (HttpWebRequest)asyncResult.AsyncState; 

     try 
     { 
      string fileName = "sincrofit.rar"; 

      using (HttpWebResponse webResponse = (HttpWebResponse)webRequest.EndGetResponse(asyncResult)) 
      { 
       byte[] buffer = new byte[1024]; 

       var newZipFile = await ApplicationData.Current.LocalFolder.CreateFileAsync(fileName, CreationCollisionOption.ReplaceExisting); 

       using (var writeStream = await newZipFile.OpenAsync(FileAccessMode.ReadWrite)) 
       { 
        using (var outputStream = writeStream.GetOutputStreamAt(0)) 
        { 
         using (var dataWriter = new DataWriter(outputStream)) 
         { 
          using (Stream input = webResponse.GetResponseStream()) 
          { 
           var totalSize = 0; 
           for (int size = input.Read(buffer, 0, buffer.Length); size > 0; size = input.Read(buffer, 0, buffer.Length)) 
           { 
            dataWriter.WriteBytes(buffer); 
            totalSize += size; //get the progress of download 
           } 
           await dataWriter.StoreAsync(); 
           await outputStream.FlushAsync(); 
           dataWriter.DetachStream(); 
          } 
         } 
        } 
       } 

      } 
     } 
     catch 
     { 

     } 

당신은 사용할 수 있습니다 이? 행운을 빕니다!