web api - 发布对象返回内部服务器错误500

问题描述:

我有一个简单的web api,它使用数据库第一个ADO SQL服务器实体,其中有一个表具有自动递增标识列和nvarchar列。我的GET功能正常工作,但我在POST时遇到了问题。web api - 发布对象返回内部服务器错误500

这里是我的控制器,这在很大程度上是自动生成的:

public class CustomersController : ApiController 
{ 
    private MyEntities db = new MyEntities(); 

    // GET: api/Customers 
    public IQueryable<Customer> GetCustomers() 
    { 
     return db.Customers; 
    } 

    // GET: api/Customers/5 
    [ResponseType(typeof(Customer))] 
    public IHttpActionResult GetCustomer(int id) 
    { 
     Customer customer = db.Customers.FirstOrDefault(x => x.CustomerPk == id); 
     if (customer == null) 
     { 
      return NotFound(); 
     } 

     return Ok(customer); 
    } 

    // PUT: api/Customers/5 
    [ResponseType(typeof(void))] 
    public IHttpActionResult PutCustomer(int id, Customer customer) 
    { 
     if (!ModelState.IsValid) 
     { 
      return BadRequest(ModelState); 
     } 

     if (id != customer.CustomerPk) 
     { 
      return BadRequest(); 
     } 

     db.Entry(customer).State = EntityState.Modified; 

     try 
     { 
      db.SaveChanges(); 
     } 
     catch (DbUpdateConcurrencyException) 
     { 
      if (!CustomerExists(id)) 
      { 
       return NotFound(); 
      } 
      else 
      { 
       throw; 
      } 
     } 

     return StatusCode(HttpStatusCode.NoContent); 
    } 

    // POST: api/Customers 
    [ResponseType(typeof(Customer))] 
    public IHttpActionResult PostCustomer(Customer customer) 
    { 
     if (!ModelState.IsValid) 
     { 
      return BadRequest(ModelState); 
     } 

     db.Customers.Add(customer); 
     db.SaveChanges(); 

     return CreatedAtRoute("DefaultApi", new { id = customer.CustomerPk }, customer); 
    } 

    // DELETE: api/Customers/5 
    [ResponseType(typeof(Customer))] 
    public IHttpActionResult DeleteCustomer(int id) 
    { 
     Customer customer = db.Customers.FirstOrDefault(x => x.CustomerPk == id); 
     if (customer == null) 
     { 
      return NotFound(); 
     } 

     db.Customers.Remove(customer); 
     db.SaveChanges(); 

     return Ok(customer); 
    } 

    protected override void Dispose(bool disposing) 
    { 
     if (disposing) 
     { 
      db.Dispose(); 
     } 
     base.Dispose(disposing); 
    } 

    private bool CustomerExists(int id) 
    { 
     return db.Customers.Count(e => e.CustomerPk == id) > 0; 
    } 
} 

在一个HTML页面,我调用下面的jQuery AJAX:

var customer = { "CustomerPk": 0, "CustomerName": "TEST2" }; 

     $.ajax(
     { 
      url: "http://serverurl/site/api/customers", 
      type: "POST", 
      contentType: "application/json; charset=UTF-8", 
      data: JSON.stringify(customer), 
      dataType: "json", 
      success: function (data, textStatus, xhr) { alert("Success"); }, 
      error: function (xhr, textStatus, errorThrown) 
      { 
       var msg = "Code: " + xhr.status + "\n"; 
       msg += "Text: " + xhr.statusText + "\n"; 
       if (xhr.responseJSON != null) 
       { 
        msg += "JSON Message: " + xhr.responseJSON.Message + "\n"; 
       } 

       alert(msg); 
      } 
     }); 

就像我提到的,当我打电话的GET从这个页面的方法,一切正常。我已经尝试了ajax方法的不同变体,它基于无数的向web api发布一个对象的例子,主要是改变我发布的对象,忽略了标识列,只发送CustomerName列,或者将Pk设置为null ,但没有一个工作。我总是得到500内部服务器错误。

它不适用于自动递增标识列吗?我见过的例子似乎并没有将这些作为模型的一部分,所以我想知道这是否是我的问题。

任何帮助或建议将不胜感激,谢谢。

您是否有权访问任何服务器端的错误日志,因为500内部错误可能有很多原因。

+0

它的日志文件中没有任何内容。但是,如果我将ajax切换到'type:GET'并将'data'行注释掉,我会获得成功,并看到日志文件中反映出来的结果 – Mike

+0

不确定为什么多次打开日志文件并且没有发现500错误,但他们最终显示为'500 0 0 31' – Mike

+0

如果我将'CustomerPk'更改为''“''或'null',我得到一个400错误,这让我认为ModelState是无效的。 – Mike