几个月来,我一直在使用这样的方法:
<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模型绑定解包请求的方式。
答案 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是正确的。