WP8.1 客户端代码中的 HttpResponseMessage 错误
HttpResponseMessage error in WP8.1 client code
我有一个问题,似乎无法通过我的 WindowsPhone 8.1 应用程序解决。在我的客户端,我正在编写代码以从我查询的数据库中检索值。虽然我能够使用我的 Bars 实体成功地做到这一点,但我似乎无法让我的 Teams 实体工作。奇怪的是,它似乎既过去了又卡在我的 HttpResponseMessage 对象的创建上。这是代码:
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;
}
}
当我 运行 这段代码时,"right after response" 没有打印到 UI,而上面的测试消息是。此外,模拟器最终会中断并从 stringToTeam 中的一行抛出 FormatException(我将 post 另一个问题),它不会在其他任何地方被调用。还值得一提的是,我的 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 数据库托管在 Azure 网站上,我的后端使用 .NET。请帮我弄清楚为什么我的团队代码不起作用。谢谢
我认为问题出在这里:
HttpResponseMessage response = await client.GetAsync("api/bars");
不应该是:
HttpResponseMessage response = await client.GetAsync("api/teams");
问题原来是我的 stringToTeam 方法中的开始和结束索引有误。一旦我解决了这个问题,代码就可以正常工作并正确显示。该方法的 IndexOf 和 Substring 调用应如下所示:
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 class。我强烈建议不要编写自己的反序列化器。使用 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());
}
}
}
这种方法远没有那么乏味。
我有一个问题,似乎无法通过我的 WindowsPhone 8.1 应用程序解决。在我的客户端,我正在编写代码以从我查询的数据库中检索值。虽然我能够使用我的 Bars 实体成功地做到这一点,但我似乎无法让我的 Teams 实体工作。奇怪的是,它似乎既过去了又卡在我的 HttpResponseMessage 对象的创建上。这是代码:
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;
}
}
当我 运行 这段代码时,"right after response" 没有打印到 UI,而上面的测试消息是。此外,模拟器最终会中断并从 stringToTeam 中的一行抛出 FormatException(我将 post 另一个问题),它不会在其他任何地方被调用。还值得一提的是,我的 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 数据库托管在 Azure 网站上,我的后端使用 .NET。请帮我弄清楚为什么我的团队代码不起作用。谢谢
我认为问题出在这里:
HttpResponseMessage response = await client.GetAsync("api/bars");
不应该是:
HttpResponseMessage response = await client.GetAsync("api/teams");
问题原来是我的 stringToTeam 方法中的开始和结束索引有误。一旦我解决了这个问题,代码就可以正常工作并正确显示。该方法的 IndexOf 和 Substring 调用应如下所示:
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 class。我强烈建议不要编写自己的反序列化器。使用 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());
}
}
}
这种方法远没有那么乏味。