WebApi导致404具有操作参数

时间:2014-07-20 14:13:57

标签: jquery asp.net-web-api

几个月来,我一直在使用这样的方法:

    <HttpGet>
    <HttpPost>
    Function MyMethod(MyParam as Integer) As HttpResponseMessage
        'return data here
    End Function

工作正常。但突然之间,我无法看到任何变化,我收到了这个错误:

{"Message":"No HTTP resource was found that matches the request URI 'http://domain/api/MyController/MyMethod'.","MessageDetail":"No action was found on the controller 'MyController' that matches the request."}

让我感到困惑的是,在调试时,我删除了参数,因此方法如下:

<HttpGet>
<HttpPost>
Function MyMethod() As HttpResponseMessage
  'return data here
End Function

这不会导致404,即使方法完全相同。这是怎么回事?!

更新:我将参数设为可选,然后调用方法IS,但不传递参数,而是使用默认值。所以问题似乎是我传递参数的方式。我使用jQuery $.post发送请求,根据Fiddler,这是发送的数据包:

POST MyDomain/api/MyController/MyMethod HTTP/1.1
Host: MyDomain
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:30.0) Gecko/20100101 Firefox/30.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
X-Requested-With: XMLHttpRequest
Content-Length: 12
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache

MyParam=123

这看起来对我来说是正确的,但WebApi并没有识别出该参数。

更新2 :我的jQuery调用如下所示:

$.post(url, postData)
    .done(function (data)
         {
             //do something on success
         })
        .fail(function (data)
        {
             //do something on failure
        });

如果我将post更改为get,则可以正常使用。所以它与(1)jQuery发送参数的方式有关,我怀疑,因为Fiddler跟踪看起来很好;或(2)WebApi模型绑定解包请求的方式。

3 个答案:

答案 0 :(得分:1)

必须是您的客户端代码以某种方式被修改为不提供MyParam参数。第二个MyMethod与第一个MyMethod不完全相同,因为它不再接受参数,从而更改方法签名。这必须是您删除参数时请求成功的原因 - 您的客户端不是首先发送它。

在您的jQuery url中,您需要添加&#34;查询参数&#34;,如下所示:

url: "api/My/MyMethod?MyParam=" + 42

或类似的东西(我不太了解jQuery)。

在阅读有关在正文中传递参数的注释后,您确定参数在方法定义中被称为MyParam吗?您需要在方法中使用实际名称。

另外,请尝试在请求正文中将其作为JSON发送,例如: "MyParam":123"MyParam":"123"(类似的东西)。

正如Toan在他的回答中所说,你必须用MyMethod属性表示你的[FromBody]参数,告诉Web API在哪里找到参数,即:

Function MyMethod([FromBody]MyParam as Integer) As HttpResponseMessage
                  ^^^^^^^^^^

由于您的参数是&#34;简单&#34;类型,如果您不添加[FromBody]属性,则可以解释您所看到的行为。 Web API正在寻找一个&#34;可选&#34; (如您所指定的)URL中的参数作为查询参数(是的,您可以使用Post方法和Get方法)。它在那里找不到但路线仍然匹配,所以它继续并使用默认值0。现在,当您添加[FromBody]参数时,Web API将在请求正文中查找它,而不是期望它作为查询参数在URL中,并且绑定现在应该按预期工作。

请参阅此文章,其中介绍了参数绑定:Parameter Binding in ASP.NET Web API

顺便说一句,您实际上可以追加到您指定[FromUri]的查询字符串,但现在暂且不用担心。

看看你的第二次编辑,它并不完全清楚jQuery语法是什么样的,特别是关于传递参数。你应该尝试这样的事情:

$.post(url, { "MyParam":123 })
    .done(function (data) {
        //do something on success
    })
    .fail(function (data)
    {
        //do something on failure
    });

正如我所说,我的jQuery并不好(我正在尝试!),但这些内容应该有效(我不清楚是否需要"MyParam)。请特别注意MyParam的传递方式(相当于您的postData)。

最后,我发现这篇关于POSTing primitive parameters to Web API的有趣文章可能会对jQuery POST操作有所帮助。它包含jQuery片段和有关[FromBody]的解释以及它们如何组合在一起。

答案 1 :(得分:1)

您必须使用 [FromBody] 属性屏蔽您的参数来自请求正文,以使其工作。

因此, 变化

 Function MyMethod(MyParam as Integer) As HttpResponseMessage
        'return data here
    End Function

 Function MyMethod([FromBody]MyParam as Integer) As HttpResponseMessage
        'return data here
   End Function

答案 2 :(得分:0)

下载/打开Fiddler并使用原始代码生成错误。当看到小提琴手中的404错误时,你很可能会发现DJikay是正确的。