2017-03-31 1 views
0

Ich habe eine einfache Web-API, die eine Datenbank erste ADO SQL-Server-Entität mit einer Tabelle verwendet, die eine automatisch inkrementierende Identität Spalte und eine Nvarchar-Spalte hat. Meine GET-Funktionen funktionieren gut, aber ich habe Probleme mit POST.Web API - Beitragsobjekt gibt internen Server Fehler 500

Hier ist mein Controller, die weitgehend automatisch generiert wurde:

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; 
    } 
} 

In einer HTML-Seite Ich rufe die folgende 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); 
      } 
     }); 

Wie ich schon erwähnt, wenn ich rufe die GET Methoden von dieser Seite funktioniert alles. Ich habe verschiedene Varianten der Ajax-Methode aus unzähligen Beispielen für das Posten eines Objekts in Web-API online versucht, meistens das Objekt, das ich poste, indem ich die Identity-Spalte weglasse und einfach die CustomerName-Spalte sende oder den Pk auf null setze , aber keiner von denen hat funktioniert. Ich bekomme immer einen 500 internen Serverfehler.

Funktioniert es nicht mit automatisch inkrementierenden Identitätsspalten? Die Beispiele, die ich gesehen habe, scheinen diese nicht als Teil des Modells zu haben, also frage ich mich, ob das mein Problem ist.

Jede Hilfe oder Beratung wäre sehr dankbar, danke.

Antwort

1

Haben Sie Zugriff auf serverseitige Fehlerprotokolle, da ein interner 500 Fehler viele Ursachen haben kann.

+0

Nichts in der Protokolldatei dafür. Wenn ich jedoch meinen AJAX zu 'type: GET' umschalte und die' data' Zeile auskommentiere, bekomme ich einen Erfolg und sehe das in der Protokolldatei – Mike

+0

Nicht sicher, warum nach mehrmaligem Öffnen der Protokolldatei keine 500 Fehler angezeigt werden , aber sie wurden schließlich als '500 0 0 31' angezeigt. – Mike

+0

Wenn ich' CustomerPk' in '" "oder" null "ändere, bekomme ich einen Fehler von 400, was mich denken lässt, dass ModelState ungültig ist. – Mike

Verwandte Themen