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内部错误可能有很多原因。
它的日志文件中没有任何内容。但是,如果我将ajax切换到'type:GET'并将'data'行注释掉,我会获得成功,并看到日志文件中反映出来的结果 – Mike
不确定为什么多次打开日志文件并且没有发现500错误,但他们最终显示为'500 0 0 31' – Mike
如果我将'CustomerPk'更改为''“''或'null',我得到一个400错误,这让我认为ModelState是无效的。 – Mike