0
データベースの最初のADO SQLサーバーエンティティを使用するシンプルなWeb APIがあります。その中に、自動インクリメントID列とnvarchar列を持つテーブルが1つあります。私のGET関数は正常に動作しますが、POSTに問題があります。web api - オブジェクトをポストすると内部サーバーエラーが返される500
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:私は、次のjqueryのAJAXを呼び出していたHTMLページでは
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;
}
}
:ここ
は、主に自動的に生成された私のコントローラを、ありますこのページのメソッドはすべて動作します。私はアイデンティティ列を残してCustomerName列を送信するか、Pkをnullに設定するだけで、ポストしているオブジェクトを主に変更して、Web APIのオンラインにオブジェクトをポストする無数の例に基づいて、さまざまなバリエーションを試しましたしかし、働いた人はいません。私はいつも500内部サーバーエラーを取得します。自動インクリメントID列では機能しませんか?私が見た例では、モデルの一部としてそれらを持っていないようだ、私はそれが私の問題かどうか疑問に思います。
ご迷惑をおかけして申し訳ありません。ありがとうございます。
ログファイルには何もありません。しかし、私のAJAXを 'type:GET'に切り替えて' data'行をコメントアウトすると、成功し、ログファイルに反映されていることがわかります – Mike
ログファイルを何度も開いて、しかし、最後に '500 0 0 31' – Mike
と表示されました。私が' CustomerPk'を '' ''または ''ヌルに変更すると400エラーが発生し、ModelStateが無効であると思います。 – Mike