2017-03-31 5 views
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列では機能しませんか?私が見た例では、モデルの一部としてそれらを持っていないようだ、私はそれが私の問題かどうか疑問に思います。

ご迷惑をおかけして申し訳ありません。ありがとうございます。

答えて

1

500の内部エラーが原因の可能性があるため、サーバー側のエラーログにアクセスできますか。

+0

ログファイルには何もありません。しかし、私のAJAXを 'type:GET'に切り替えて' data'行をコメントアウトすると、成功し、ログファイルに反映されていることがわかります – Mike

+0

ログファイルを何度も開いて、しかし、最後に '500 0 0 31' – Mike

+0

と表示されました。私が' CustomerPk'を '' ''または ''ヌルに変更すると400エラーが発生し、ModelStateが無効であると思います。 – Mike

関連する問題