【问题标题】:web api - posting object returns internal server error 500web api - 发布对象返回内部服务器错误 500
【发布时间】:2017-08-26 07:23:28
【问题描述】:

我有一个简单的 Web api,它使用数据库优先的 ADO SQL 服务器实体,其中有一个表,其中有一个自动递增的标识列和一个 nvarchar 列。我的 GET 函数工作正常,但我在使用 POST 时遇到问题。

这是我的控制器,大部分是自动生成的:

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 内部服务器错误。

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

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

【问题讨论】:

    标签: jquery ajax asp.net-web-api asp.net-web-api2


    【解决方案1】:

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

    【讨论】:

    • 日志文件中没有任何内容。但是,如果我将 ajax 切换到 type: GET 并注释掉 data 行,我会成功并在日志文件中看到这一点
    • 不知道为什么在多次打开日志文件并没有看到 500 错误后,但它们最终显示为 500 0 0 31
    • 如果我将 CustomerPk 更改为 ""null 会收到 400 错误,这让我认为 ModelState 无效。
    • 这是模型状态。将 CustomerPk 更改为 CustomerId,以便模型绑定器将其识别为主键并且不需要值。然后它起作用了。感谢您帮助我到达那里。
    猜你喜欢
    • 1970-01-01
    • 2017-10-28
    • 1970-01-01
    • 1970-01-01
    • 2012-05-05
    • 2020-10-13
    • 2016-04-02
    • 2021-01-14
    • 2019-05-24
    相关资源
    最近更新 更多