带有效负载的ASP.net MVC HTTP请求错误

时间:2015-06-16 15:55:08

标签: asp.net json asp.net-mvc http

我正在创建一个带有RESTful API的ASP.net MVC网站到SQL数据库。我已经实现了一个控制器来保存HTTP命令。

其中一个命令是POST命令:

     // POST: api/PoolTests
     [ResponseType(typeof(PoolTest))]
     public IHttpActionResult PostPoolTest(PoolTest poolTest)
     {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

        db.PoolTests.Add(poolTest);
        db.SaveChanges();

        return CreatedAtRoute("DefaultApi", new { id = poolTest.Id }, poolTest);
     }

我正在使用Fiddler测试功能,我得到一些奇怪的结果。根据自动生成的API文档,请求格式应该是具有此结构的JSON(这些是连接SQL数据库的字段):

               {
                 "Id": 1,
                 "SiteID": "sample string 2",
                 "Date": "sample string 3",
                 "Tub": "sample string 4",
                 "par1": 5.1,
                 "par2": 6.1,
                 "par3": 7.1,
                 "par4": 8.1
               }

在小提琴作曲家中,我选择POSThttp://localhost:53660/api/PoolTests以及JSON有效载荷{"Id": 1,"SiteID": "sample string 2", "Date": "sample string 3","Tub": "sample string 4","par1": 5.1, "par2": 6.1,"par3": 7.1,"par4": 8.1}

这会导致HTTP 400错误代码。

如果我发送没有JSON(有效负载)的相同请求,则它会在行db.PoolTests.Add(poolTest);处中断,因为有效负载为空。

如果我在第if (!ModelState.IsValid)行放置一个断点,则有效负载永远不会达到断点。它几乎与有效负载一样,无法识别实际的HTTP命令。

任何想法 - 我很欣赏可能会遗漏一些细节。

ADDED:PoolTest Class

public class PoolTest
{
    public int Id { get; set; }
    public string SiteID { get; set; }
    public string Date { get; set; }
    public string Tub { get; set; }
    public double par1 { get; set; }
    public double par2 { get; set; }
    public double par3 { get; set; }
    public double par4 { get; set; }
}

FIDDLER截图已添加:

我添加了content-type,现在我点击了断点,但Pooltest被报告为null

enter image description here

2 个答案:

答案 0 :(得分:1)

尝试将方法签名更改为:

public IHttpActionResult PostPoolTest([FromBody]PoolTest poolTest)

这应该可以让你至少达到你的断点。从那里你可以看到模型错误。

答案 1 :(得分:1)

您需要将print移至请求正文。在Fiddler中,它将是一个单独的输入框(在屏幕截图中的输入框下方)。

data标题成为:

POST http://localhost:53660/api/pooltests

标题User-Agent: Fiddler Host: localhost:53660 Content-Type: application/json Content-Length: 140 应为 application / json ,并为您计算Content-Type。您正在定义一个不正确的标题Content-Length

请求正文中,您可以粘贴数据

data

您可以单独保留操作签名,但是当您想要向网址添加参数时,{"Id": 1,"SiteID": "sample string 2", "Date": "sample string 3","Tub": "sample string 4","par1": 5.1, "par2": 6.1,"par3": 7.1,"par4": 8.1} 会很有用。

[FromBody]

使用jQuery的AJAX请求如下所示:

[ResponseType(typeof(PoolTest))]
public IHttpActionResult PostPoolTest([FromBody] PoolTest poolTest)
{
    ...
}