スタックオーバーフロー。
私が今日抱えている問題は、IDで単一の食品を取得しようとしてlocalhost:xxxxxにgetリクエストを送信すると、500の内部サーバーエラーが発生することです。
これについて私が理解していないのは、デバッグのコードを調べたところ、データベースから必要なすべての情報を含むアイテムが見つかったことが示されていますが、「OK(食品)」で送信しているときは、情報があるにもかかわらず、500内部サービスエラーを受け取ります。
私はWebAPIにかなり慣れていないので、いくつかの説明をいただければ幸いです。Visual Studio 2015、Entity Frame Work 6、およびSQL Management ServerDBを使用しています。
リンクを投稿して申し訳ありませんが、画像を投稿するには10の評判が必要だと言われています
protected void Page_Load(object sender, EventArgs e)
{
HttpClient client = new HttpClient();
client.BaseAddress = new Uri("http://localhost:63591/");
client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
HttpResponseMessage response = client.GetAsync("api/foods/" + Request.QueryString["ID"]).Result;
if (response.IsSuccessStatusCode)
{
string foodstring = response.Content.ReadAsStringAsync().Result;
Food editFood = JsonConvert.DeserializeObject<Food>(foodstring);
EditFoodName.Text = editFood.FoodName;
EditCalories.Text = editFood.Calories.ToString();
EditNotes.Text = editFood.Notes;
}
}
[ResponseType(typeof(Food))]
public IHttpActionResult GetFood(int id)
{
Food food = db.Foods.Find(id);
if (food == null)
{
return NotFound();
}
return Ok(food);
}
public partial class Food
{
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
public Food()
{
this.MealFoods = new HashSet<MealFood>();
}
public int FoodID { get; set; }
public string FoodName { get; set; }
public int Calories { get; set; }
public string Notes { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<MealFood> MealFoods { get; set; }
}
代わりに、db.Foodsを直接操作するか、独自のパブリックオブジェクトを作成し、Linqを使用してクエリを管理するか、EntityFrameworkによって作成されたオブジェクトを直接操作する場合は、遅延読み込みとプロキシ生成を無効にする必要があります。独自の実装を使用すると、メソッドは次のようになります。
[ResponseType(typeof(PseudoFood))]
public IHttpActionResult GetFood(int id)
{
//Food food = db.Foods.Find(id);
PseudoFood food = (from a in db.Foods
where a.FoodID == id
select new PseudoFood()
{
FoodName = a.FoodName,
FoodID = a.FoodID,
Calories = a.Calories,
Notes = a.Notes
}).FirstOrDefault();
if (food == null)
{
return NotFound();
}
return Ok(food);
}
Foodの代わりにPseudoFoodを使用する[ResponseType(typeof(PseudoFood))]に注意してください。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加