从Fiddler向ASP.NET Web API发起POST请求

4

我有一个ASP.NET Web API。我正在尝试将字符串POST到端点。我的ASP.NET Web API端点如下:

[HttpPost]
public async Task<IHttpActionResult> Test(string name)
{
  int i = 0;
  i = i + 1;
  return Ok();
}

在 Fiddler 中,我从 Composer 执行了如下请求:
POST http://localhost:8089/api/MyApiController/test

如果我将 "string name" 参数移除,就可以成功执行我的API端点。当存在字符串名称时,会出现405错误。因此,我在Fiddler的"请求正文"部分中添加了以下内容:

John

不幸的是,这仍然会导致抛出405错误。我无法确定我是否设置了错误的Web API端点,或者我是否在fiddler中设置了错误的请求。我的完整请求如下:

POST http://localhost:8089/api/MyApiController/test HTTP/1.1
User-Agent: Fiddler
Host: localhost:8089
Content-Length: 26
Content-Type: application/json; charset=utf-8        

{ "name" : "John"}

响应的格式如下所示:
HTTP/1.1 405 Method Not Allowed
Cache-Control: no-cache
Pragma: no-cache
Allow: GET
Content-Type: application/json; charset=utf-8
Expires: -1
Server: Microsoft-IIS/8.0
X-SourceFiles: =?UTF-8?B?QzpcRWNvZmljXFNvbGlkUVxKTExcamxsLW1hcmtldHNwaGVyZVxXZWJzaXRlXGFwaVxTZWFyY2hBcGlcaW5kZXg=?=
X-Powered-By: ASP.NET
Date: Fri, 12 Dec 2014 15:51:50 GMT
Content-Length: 73

{"Message":"The requested resource does not support http method 'POST'."}

我不明白为什么在没有参数的情况下允许使用POST,但是当我添加参数时,POST就无法工作了。
[更新] 我在我的C#代码中添加了以下内容:
var content = await Request.Content.ReadAsStringAsync();

我认为JSON会在content中。然而,content只是一个空字符串。


3
不要忘记在请求中添加 Content-Type: application/json 头部。 - peco
1
看起来你需要在 string name 上加上 [FromBody] 属性,因为你没有将它包含在 URI 中。 - NWard
@peco - 我添加了Content-Type。不幸的是,那并没有解决问题。 - user687554
@NWard - 我添加了 [FromBody]。不幸的是,这没有解决问题。 - user687554
4个回答

4
在“Composer”选项卡下: 我建议您尝试使用以下网址。 enter image description here
http://localhost:8089/api/MyApi/test

我认为问题出在路由上。

你应该有一些路由,就像以下默认路由一样,只需控制器/ id。这条路由要先于默认路由。

config.Routes.MapHttpRoute(
                name: "DefaultApi1",
                routeTemplate: "api/{controller}/{action}",
                defaults: new { action="test" }
            );

您的操作应该像这样。
[HttpPost]
public async Task<IHttpActionResult> Test([Frombody]string name)
{
  int i = 0;
  i = i + 1;
  return Ok();
}

只要它有一个参数,当我向操作进行POST时,仍然会收到405错误。 - user687554

1
在编写器的正文部分尝试使用以下 HTML 代码:


{ "name" : "somtext"}

不幸的是,我仍然收到了405错误。 - user687554

1

下面,我将参数的数据类型从字符串修改为对象,并且成功了。

public async Task<IHttpActionResult> Post( [ FromBody ] **object** items )
{
    Console.WriteLine( items );
    return Ok();
}

0
在正文中,您需要添加Json或XML语法,而不仅仅是Asp.Net Deserialiser的名称,以便其正常工作。 Json示例如下:
{ "name" : "John" }

编辑:如果您正在使用默认路由,则您的URL路由似乎也不正确。默认情况下,它将被识别为:POST http://localhost:8089/api/MyApiController/,“test”部分被省略,因为它将其识别为POST方法。您的操作还应指定您从请求正文中获取的参数(“name”)public async Task<IHttpActionResult> Test([FromBody]string name)。现在,如果您执行以下操作,则您的URL将匹配:

`POST http://localhost:8089/api/MyApiController/`
User-Agent: Fiddler
Host: localhost:8089
Content-Length: 26

{ "name" : "John" }

好的,可能需要更多的细节。你能在帖子中添加来自Fiddler的完整请求吗?也许展示一下你的路由是如何定义的会很有用(即默认路由还是属性路由?)。 - MartinM
我已经将请求和响应的完整文本添加到上面的问题中。谢谢您的帮助。 - user687554
@user687554 更新了我的答案。我测试过了,似乎可以工作。也按照你最初描述的方式进行了测试,结果也得到了405状态码,就像修改中所描述的一样。 - MartinM
谢谢你的帮助。我认为它更接近了。当我从 Fiddler 发布时,我的断点被触发了。然而,参数值总是 null。这是为什么呢? - user687554
可能还需要添加一个标头,指定您正在使用JSON。Content-Type: application/json - MartinM
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接