【问题标题】:What is wrong with this ASP.Net and Fiddler example?这个 ASP.Net 和 Fiddler 示例有什么问题?
【发布时间】:2012-08-08 11:58:45
【问题描述】:

我正在使用 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 测试,所以我有

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

请求正文
{"abc": "def"}

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

【问题讨论】:

    标签: asp.net-web-api fiddler


    【解决方案1】:

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

    public string Post([FromBody] string abc)
    

    (2) '{"abc": "def"}' 定义了一个具有名为 "abc" 属性的对象 - 要发送 JSON 字符串,请求正文应为 "def"

    【讨论】:

    • 发现它应该是 Fiddler 中的 =def,而不是“def”。我发布了一个答案,其中包含有关我错过的更多详细信息。
    • 啊,我一定是刚起床。 Cuong Le 昨天回答了我的问题,但后来从我的帖子中删除了他的回答。他发布了他自己的问题,你,迈克,回答了这个问题。答案就是你的博文。直到现在我才注意到。
    【解决方案2】:

    这个答案来自 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. 正如 Mike 所说,您必须使用 [FromBody]。
    2. 您只能有 1 个参数。如果您需要超过 1 个参数,您有 2 个选择:i) 使用 url 查询参数,而不是请求正文或 ii) 使用复杂对象(即您自己的类)。
    3. 请求正文应该是一个简单的=def,并且不能使用命名参数。

    【讨论】:

      猜你喜欢
      • 2010-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-03
      • 1970-01-01
      • 2018-09-05
      • 2016-07-05
      • 1970-01-01
      相关资源
      最近更新 更多