【问题标题】:POST to ASP.NET Web API from Fiddler从 Fiddler POST 到 ASP.NET Web API
【发布时间】:2014-12-12 15:16:59
【问题描述】:

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

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

在 Fiddler 中,我执行来自作曲家的以下请求:

POST http://localhost:8089/api/MyApiController/test

如果我删除“字符串名称”作为参数,我可以成功执行我的 API 端点。当字符串名称存在时,我收到 405 错误。因此,我在 Fiddler 的“请求正文”部分添加了以下内容:

John

不幸的是,这仍然会导致 405 被抛出。如果我在提琴手中错误地设置了我的请求,我无法判断我是否设置了我的 Web API 端点错误。我的完整请求如下所示:

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 只是一个空字符串。

【问题讨论】:

  • 不要忘记请求中的Content-Type: application/json 标头。
  • 看起来您需要 string name 上的 [FromBody] 属性,因为您没有将其包含在 URI 中。
  • @peco - 我添加了 Content-Type。不幸的是,这并没有解决问题。
  • @NWard - 我添加了 [FromBody]。不幸的是,这并没有解决问题。

标签: c# asp.net-web-api


【解决方案1】:

在“作曲家”标签下:

我建议你应该尝试以下网址

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();
}

【讨论】:

  • 只要有参数,当我发布到操作时,我仍然会收到 405。
【解决方案2】:

在作曲家的正文部分尝试

{ "name" : "somtext"}

【讨论】:

  • 不幸的是,我仍然得到 405。
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

    在正文中,您需要添加 Json 或 XML 语法,而不仅仅是为 Asp.Net Deserialiser 命名来完成它的工作。 Json 将是:

    { "name" : "John" }
    

    编辑:如果您使用默认路由,您的 url 路由似乎也不正确。默认情况下,它将被拾取为:POST http://localhost:8089/api/MyApiController/“测试”部分被省略,因为它认为这是一个 POST 方法。您的操作还应指定您接受的参数(“名称”)应来自正文 public async Task&lt;IHttpActionResult&gt; Test([FromBody]string name)。现在,如果您执行以下操作,您的网址将匹配:

    `POST http://localhost:8089/api/MyApiController/`
    User-Agent: Fiddler
    Host: localhost:8089
    Content-Length: 26
    
    { "name" : "John" }
    

    【讨论】:

    • 好的,可能需要更多细节。您可以将提琴手的完整请求添加到您的帖子中吗?也可能有助于显示您的路由的定义方式/位置(即默认路由或属性路由?)。
    • 我添加了请求和对上述问题的响应的全文。感谢您的帮助。
    • @user687554 更新了我的答案。我对此进行了测试,似乎可行。还测试了您最初描述的方式并得到了 405,如编辑中所述。
    • 感谢您的帮助。我认为它更接近。当我从 Fiddler 发帖时,我的断点被击中。但是,参数值始终为null。为什么会这样?
    • 可能还需要添加一个标头来指定您使用的是 json。内容类型:application/json
    猜你喜欢
    • 1970-01-01
    • 2015-11-02
    • 1970-01-01
    • 2020-07-06
    • 2023-03-29
    • 2022-10-07
    • 1970-01-01
    • 2014-01-28
    • 1970-01-01
    相关资源
    最近更新 更多