的StackOverflow。
我今天遇到的问题是当我向localhost发送get请求时:xxxxx试图通过ID获取单个食物项目,我收到500内部服务器错误。
我对此无法理解,我在调试中经历了代码并且它显示它从我的数据库中找到了所需信息的所有信息,但是当它在“OK(食物)”中发送时“,即使有信息,我也会收到500内部服务错误。
我对web api很新,所以一些解释将不胜感激。我正在使用Visual Studio 2015,Entity Frame Work 6和SQL Management Server DB。
我很抱歉发布链接,它说我需要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; }
}
答案 0 :(得分:1)
在操作GetFood
中,您指定了返回类型为Food
。默认情况下,EntityFramework会在您的实体周围生成代理对象以进行延迟加载。
意思是该行:
Food food = db.Foods.Find(id);
不会返回Food
个对象,而是一个动态的食物子类。这也可以在您在评论中发布的错误中看到,说明操作不期望返回类型Food_31C9E7DC...
。
有三种方法可以解决这个问题:
答案 1 :(得分:0)
而是直接使用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);
}
注意[ResponseType(typeof(PseudoFood))],使用PseudoFood代替食物。