2015-03-19 2 views
0

У меня проблема, которую я не могу понять с помощью своего приложения WindowsPhone 8.1. На моей стороне клиента я пишу код для извлечения значений из базы данных, которую я запрашиваю. Хотя мне удалось успешно сделать это с моими объектами Bars, я не могу заставить свои группы работать. Странно то, что кажется, что и прошло, и застревает в создании моего объекта HttpResponseMessage. Вот код:Ошибка HttpResponseMessage в коде клиента WP8.1

private void refresh_Click(object sender, RoutedEventArgs e) 
    { 
     GetTeams(); 
     //getTeamById(10); 
    } 


    public async void GetTeams() 
    { 
     using (var client = new HttpClient()) 
     { 
      teamsListBox.Items.Add("using block entered"); 
      client.BaseAddress = new Uri("http://nflff.azurewebsites.net"); 
      client.DefaultRequestHeaders.Accept.Clear(); 
      client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 
      teamsListBox.Items.Add("client's defaultrequestheaders done"); 

      HttpResponseMessage response = await client.GetAsync("api/bars");//not getting past here 
      teamsListBox.Items.Add("right after response"); //not printing 
      if (response.IsSuccessStatusCode) 
      { 
       teamsListBox.Items.Add("if entered"); 
       //IList<Teams> Teams = await response.Content.ReadAsAsync<IList<Teams>>(); 
       string teams = await response.Content.ReadAsStringAsync(); 

       int start = 0; 
       while (start != -1) 
       { 
        start = stringToTeam(teams, start); //throwing exception inside stringToTeams, which isn't being called anywhere else 
       } 
      } 
      teamsListBox.Items.Add(Teams.TeamsList.Count); 
      foreach (var team in Teams.TeamsList) 
      { 
       teamsListBox.Items.Add(team.ToString()); 
      } 
     } 
    } 

public int stringToTeam(String Team, int start) 
    { 
     start = Team.IndexOf("TeamID", start) + 8; 
     int end = Team.IndexOf(",", start); //start index correct 
     //teamsListBox.Items.Add(end); 
     int id = Convert.ToInt32(Team.Substring(start, end - start)); //throws FormatException for string to DateTime 
     //String id = Team.Substring(start, (end - start)); 
     teamsListBox.Items.Add("id is " + id); 
     start = Team.IndexOf("TeamName", start) + 11; 
     end = Team.IndexOf("\"", start); 
     //teamsListBox.Items.Add(end); 
     String name = Team.Substring(start, (end - start)); 
     teamsListBox.Items.Add("name is " + name); 

     String city = Team.Substring(start, (end - start)); 
     teamsListBox.Items.Add("city is " + city); 
     start = Team.IndexOf("TeamState", start) + 12; 
     end = Team.IndexOf("\"", start); 
     //teamsListBox.Items.Add(end); 


     //creates a Teams model obj with values pulled from string and adds it to static list of objs in Teams model 
     //teamsListBox.Items.Add(Teams.TeamsList.Count); 
     Teams newTeam = new Teams(id, name, city); 
     Teams.TeamsList.Add(newTeam); 
     //teamsListBox.Items.Add(Teams.TeamsList.Count); 
     //teamsListBox.Items.Add(newTeam.ToString()); 

     end += 4; 
     if (end <= Team.Length) 
     { 
      return end; 
     } 
     else 
     { 
      return -1; 
     } 
    } 

Когда я запускаю этот код, «сразу после ответа» не печатает на UI, в то время как тестовые сообщения над ними. Кроме того, эмулятор, в конце концов, сломается и выкинет исключение FormatException из строки в stringToTeam (о котором я расскажу еще об одном вопросе), который не будет вызван нигде. Также стоит упомянуть, что у меня есть тот же самый код для моего объекта Bars (с именами, которые, конечно же, переключаются), и бары отлично работают. Я сравнивал каждую строку кода в этих методах, а также модели и серверные контроллеры, и они точно такие же. Итак, почему код штрихов работает, пока код команды не работает?

Если это помогает, вот мой код модели:

public class Teams 
{ 
    private int teamID { get; set; } 
    private string teamName { get; set; } 
    private string teamCity { get; set; } 
    //private object teamFlag { get; set; } //Janci, I was never able to see your comments. What is teamFlag? Is that their logo? 
    public static List<Teams> TeamsList = new List<Teams>(); 

    public Teams(int id, string name, string city) 
    { 
     teamID = id; 
     teamName = name; 
     teamCity = city; 
    } 

    public override string ToString() 
    { 
     return "Team: " + teamID.ToString() + " " + teamName.ToString() + " City: " + teamCity; 
    } 
} 

У меня есть база данных SQL, размещенную на веб-сайте лазурь, и я использую .NET для моего внутреннего интерфейса. Пожалуйста, помогите мне разобраться, почему код моей команды не будет работать. Благодарю.

ответ

0

Проблема оказалась в том, что у меня были неправильные начальные и конечные показатели в моем методе stringToTeam , Как только я исправил это, код работал и отображался правильно. Метод по IndexOf и подстроку вызовы должны выглядеть следующим образом:

 start = Team.IndexOf("TeamID", start) + 8; 
     int end = Team.IndexOf(",", start); //start index correct 
     //teamsListBox.Items.Add(end); 
     int id = Convert.ToInt32(Team.Substring(start, end - start)); //throws FormatException for string to DateTime 
     //String id = Team.Substring(start, (end - start)); 
     //teamsListBox.Items.Add("id is " + id); 
     start = Team.IndexOf("TeamName", start) + 11; 
     end = Team.IndexOf("\"", start); 
     //teamsListBox.Items.Add(end); 
     String name = Team.Substring(start, (end - start)); 
     //teamsListBox.Items.Add("name is " + name); 
     start = Team.IndexOf("TeamCity", start) + 11; 
     end = Team.IndexOf("\"", start); 
     String city = Team.Substring(start, (end - start)); 

После ручного кодирования свой собственный десериализатор и тонкой настройки для каждого объекта, я обнаружил класс JsonConvert. Я настоятельно рекомендую не писать собственный десериализатор. Использование JsonConvert, можно удалить метод мой stringToTeam() и заменить свои старые GetTeams() со следующим:

public async void GetTeams() 
    { 
     using (var client = new HttpClient()) 
     { 
      client.BaseAddress = new Uri("http://nflff.azurewebsites.net"); 
      client.DefaultRequestHeaders.Accept.Clear(); 
      client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 

      HttpResponseMessage response = await client.GetAsync("api/teams");//not getting past here 

      if (response.IsSuccessStatusCode) 
      { 
       string s = await response.Content.ReadAsStringAsync(); 
       var deserializedResponse = JsonConvert.DeserializeObject<List<Teams>>(s); 
       foreach (Teams team in deserializedResponse) 
       { 
        teamsListBox.Items.Add(team.ToString()); 
       } 

      } 
      foreach (var team in Teams.TeamsList) 
      { 
       teamsListBox.Items.Add(team.ToString()); 
      } 
     } 
    } 

Этот подход является гораздо менее утомительным.

0

Я думаю, что проблема здесь:

HttpResponseMessage response = await client.GetAsync("api/bars"); 

Не должно быть:

HttpResponseMessage response = await client.GetAsync("api/teams"); 
+0

Упс. Я снова копировал рабочий код из моего объекта в свою группу и забыл изменить его. Проблема все еще происходит, как только я изменил это. – jeffkempf

+0

Используйте скрипач, чтобы узнать, что происходит на проводе, и быть возвращенным. –

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