这个ASP.Net和Fiddler的例子有什么问题?

时间:2012-08-08 11:58:46

标签: asp.net-web-api fiddler

我正在使用Visual Studio 2012 RC。我使用默认路由并具有以下Web API控制器:

public class FooController : ApiController
{
    // GET api/foo
    public IEnumerable<string> Get()
    {
        return new string[] { "value1", "value2" };
    }

    // GET api/foo/5
    public string Get(int id)
    {
        return "value";
    }

    // POST api/foo
    public string Post(string abc)
    {
        Console.WriteLine("value: {0}", abc);
        return "foo" + abc;
    }

    // PUT api/foo/5
    public void Put(int id, string value)
    {
    }

    // DELETE api/foo/5
    public void Delete(int id)
    {
    }
}

我想在Fiddler中对POST做一个简单的测试,所以我有

请求标头
用户代理:Fiddler
内容类型:application / json

请求正文
{{abc“:”def“}

当我调试请求时,参数abc为null,而不是“def”。我的Fiddler语法有问题吗?

2 个答案:

答案 0 :(得分:5)

(1)默认情况下,从URI中获取简单类型。要从请求正文中读取简单类型,请将[FromBody]属性添加到参数中。

public string Post([FromBody] string abc)

(2)'{“abc”:“def”}'定义一个名为“abc”的属性 - 发送一个JSON字符串,请求体应该只是“def”

答案 1 :(得分:0)

这个答案来自ASP.Net Web API网站sending-html-form-data上的一个链接,后来证明是Mike的博客文章(我最初没有意识到)。 Web API团队通过参数绑定做出了一些与普通MVC控制器完全不同的决策。

发送“简单类型”的正确语法是

public HttpResponseMessage PostSimple([FromBody] string value)
{
// code goes here

在Fiddler,你把

=def          //THIS CANNOT HAVE QUOTES AND = IS MANDATORY

好的,所以这些部分的工作方式与MVC完全不同。

  1. 你必须像迈克所说的那样使用[FromBody]。
  2. 您只能有1个参数。如果你想要多于1个参数,你有2个选择:i)使用url查询参数,而不是请求体或ii)使用复杂对象(即你自己的类)。
  3. 请求正文应该是一个简单的= def,不能使用命名参数。