WebAPI POST方法抛出空异常

甲壳素

我已经创建了一个WebAPI项目,该项目在使用DELETE和GET方法时可以正常工作,但是当我尝试POST或PUT时,我会收到

第84行上的{“值不能为null。\ r \ n参数名称:实体”},db.Reviews.Add(review)

我正在使用Postman进行测试,也尝试使用XMLHttpRequest,但是这两种方法都可以在GET / DELETE上运行,而在PUT / POST上失败。

var update1 = new XMLHttpRequest();
var params = "ReviewID=123";
update1.open("POST", "http://localhost:49681/Api/Reviews/", true);
update1.setRequestHeader("Content-type", "application/json");
update1.send(params);

ReviewsController

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
using System.Web.Http;
using System.Web.Http.Description;
using ReviewApp.Models;

namespace ReviewApp.Controllers
{
    public class ReviewsController : ApiController
    {
        private CheetahEntities db = new CheetahEntities();

        // GET: api/Reviews
        public IQueryable<Review> GetReviews()
        {
            return db.Reviews;
        }

        // GET: api/Reviews/5
        [ResponseType(typeof(Review))]
        public async Task<IHttpActionResult> GetReview(string id)
        {
            Review review = await db.Reviews.FindAsync(id);
            if (review == null)
            {
                return NotFound();
            }

            return Ok(review);
        }

        // PUT: api/Reviews/5
        [ResponseType(typeof(void))]
        public async Task<IHttpActionResult> PutReview(string id, Review review)
        {
            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }

            if (id != review.ReviewID)
            {
                return BadRequest();
            }

            db.Entry(review).State = EntityState.Modified;

            try
            {
                await db.SaveChangesAsync();
            }
            catch (DbUpdateConcurrencyException)
            {
                if (!ReviewExists(id))
                {
                    return NotFound();
                }
                else
                {
                    throw;
                }
            }

            return StatusCode(HttpStatusCode.NoContent);
        }

        // POST: api/Reviews
        [ResponseType(typeof(Review))]
        public async Task<IHttpActionResult> PostReview(Review review)
        {
            /*
            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }
            */
            db.Reviews.Add(review);

            try
            {
                await db.SaveChangesAsync();
            }
            catch (DbUpdateException)
            {
                if (ReviewExists(review.ReviewID))
                {
                    return Conflict();
                }
                else
                {
                    throw;
                }
            }

            return CreatedAtRoute("DefaultApi", new { id = review.ReviewID }, review);
        }

        // DELETE: api/Reviews/5
        [ResponseType(typeof(Review))]
        public async Task<IHttpActionResult> DeleteReview(string id)
        {
            Review review = await db.Reviews.FindAsync(id);
            if (review == null)
            {
                return NotFound();
            }

            db.Reviews.Remove(review);
            await db.SaveChangesAsync();

            return Ok(review);
        }

        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                db.Dispose();
            }
            base.Dispose(disposing);
        }

        private bool ReviewExists(string id)
        {
            return db.Reviews.Count(e => e.ReviewID == id) > 0;
        }
    }
}

审查

//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated from a template.
//
//     Manual changes to this file may cause unexpected behavior in your application.
//     Manual changes to this file will be overwritten if the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

namespace ReviewApp.Models
{
    using System;
    using System.Collections.Generic;

    public partial class Review
    {
        public string ReviewID { get; set; }
        public string ReviewStatus { get; set; }
        public Nullable<System.DateTime> Date { get; set; }
        public string Account { get; set; }
    }
}

猎豹实体

//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated from a template.
//
//     Manual changes to this file may cause unexpected behavior in your application.
//     Manual changes to this file will be overwritten if the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

namespace ReviewApp.Models
{
    using System;
    using System.Data.Entity;
    using System.Data.Entity.Infrastructure;

    public partial class CheetahEntities : DbContext
    {
        public CheetahEntities()
            : base("name=CheetahEntities")
        {
        }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            throw new UnintentionalCodeFirstException();
        }

        public virtual DbSet<Review> Reviews { get; set; }
    }
}
恩科西

在请求你的内容类型application/json,但送你paramsReviewId=123这不是JSON。params如果以的形式发送Content-Type则应使用格式正确的JSON对象application/json

var update1 = new XMLHttpRequest();
var params = JSON.stringify({ ReviewID : 123 }); //JSON payload
update1.open("POST", "http://localhost:49681/Api/Reviews/", true);
update1.setRequestHeader("Content-type", "application/json");
update1.send(params);

在你的PostReview方法没有为潜在的review变量是null,如果该POST请求未正确发送,但出现了试图将其添加到数据库之前不变量的检查。您已注释掉模型上的验证检查。

// POST: api/Reviews
[ResponseType(typeof(Review))]
public async Task<IHttpActionResult> PostReview(Review review) {

    if (review == null) ModelState.AddModelError("", "invalid data");

    if (!ModelState.IsValid) {
        return BadRequest(ModelState);
    }

    db.Reviews.Add(review);

    try {
        await db.SaveChangesAsync();
    } catch (DbUpdateException) {
        if (ReviewExists(review.ReviewID)) {
            return Conflict();
        } else {
            throw;
        }
    }

    return CreatedAtRoute("DefaultApi", new { id = review.ReviewID }, review);
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

WebApi路由-许多POST方法

来自分类Dev

正确压缩webapi POST的方法

来自分类Dev

WebApi路由-许多POST方法

来自分类Dev

POST请求抛出空异常

来自分类Dev

WebAPI 控制器在后台抛出异常

来自分类Dev

从 WebApi 返回自定义错误响应而不抛出异常

来自分类Dev

webapi接收空参数

来自分类Dev

如何重载WebApi方法

来自分类Dev

WebAPI异步方法错误

来自分类Dev

REST WEBAPI POST方法的参数未调用

来自分类Dev

HTTP POST方法被视为WebApi上的GET

来自分类Dev

REST WEBAPI POST方法的参数未调用

来自分类Dev

WebApi post方法中的参数绑定

来自分类Dev

WebApi2控制器Post方法始终接收空的FromBody

来自分类Dev

使用Fiddler POST测试WebApi

来自分类Dev

测试Patch OData WebAPI方法

来自分类Dev

测试Patch OData WebAPI方法

来自分类Dev

WebApi路由-许多GET方法

来自分类Dev

以RESTful WebApi方法检索主体

来自分类Dev

同步调用 webAPI 方法

来自分类Dev

WebApi 2.1 PUT抛出错误415

来自分类Dev

如何处理WebAPI 2.方法中的异常?

来自分类Dev

如何处理WebAPI 2.方法中的异常?

来自分类Dev

枚举静态方法抛出空指针异常

来自分类Dev

未引发 Webapi 2 全局异常处理

来自分类Dev

Angularjs和WebAPI Put方法参数始终为空

来自分类Dev

WebAPI HttpContext在ContinueWith()=> tast中为空

来自分类Dev

C#WebApi.SelfHost帖子为空

来自分类Dev

WebAPI C# HttpPost 变量为空