0

может звучать как noob, но эта проблема действительно не выходит из моего ума. Я столкнулся с странной проблемой в отношении Windows Phone 8.1. Я разработал приложение для Windows Phone 8, которое связывается с сервером шлюза и обрабатывает запрошенные данные. Мы использовали HttpClient для отправки/получения данных на сервер шлюза. Однако по некоторым причинам я обновил ОС Windows Phone 8 до Windows Phone 8.1, но теперь он не обрабатывает запрос, когда я общаюсь с сервером шлюза.HttpClient с 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); Ответ всегда содержит 0 байт всякий раз, когда мы запускаем это приложение на Windows Phone 8.1.

Вот фрагмент кода, которые взаимодействуют с сервером

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; 
     } 

Запрос Utility код сниппета

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

Я prefert использовать HttpWebRequest и HttpWebResponse классы для делать простые запросы на сервер, используйте:

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 
     { 

     } 

Вы можете использовать это? Удачи!

Смежные вопросы