Asp.net 一个简单的对Web API的POST请求根本没有命中API

Asp.net 一个简单的对Web API的POST请求根本没有命中API,asp.net,asp.net-mvc,asp.net-web-api,dotnet-httpclient,Asp.net,Asp.net Mvc,Asp.net Web Api,Dotnet Httpclient,在我的MVC应用程序中,我试图向名为MembershipController的API控制器中的这些示例端点(操作)发出POST请求: [HttpPost] public string GetFoo([FromBody]string foo) { return string.Concat("This is foo: ", foo); } [HttpPost] public string GetBar([FromBody]int bar) { return string.Conca

在我的MVC应用程序中,我试图向名为
MembershipController
的API控制器中的这些示例端点(操作)发出POST请求:

[HttpPost]
public string GetFoo([FromBody]string foo)
{
    return string.Concat("This is foo: ", foo);
}

[HttpPost]
public string GetBar([FromBody]int bar)
{
    return string.Concat("This is bar: ", bar.ToString());
}

[HttpPost]
public IUser CreateNew([FromBody]NewUserAccountInfo newUserAccountInfo)
{
    return new User();
}
以下是客户端代码:

var num = new WebAPIClient().PostAsXmlAsync<int, string>("api/membership/GetBar", 4).Result;
我为Web API定义了以下默认路由:

config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{action}/{id}",
            defaults: new { id = RouteParameter.Optional }
更新 我的代码会中断到调试器中,直到调用
System.Net.HttpClient
code上的
PostAsXmlAsync
方法为止。然而,在Fiddler中没有显示任何请求

但是,如果我尝试在Fiddler中编写POST请求,或尝试通过浏览器向其中一个API端点发出GET请求,则通过Fiddler编写的POST请求会告诉我,我没有发送任何数据,必须发送。浏览器发送的GET请求正确地告诉我该操作不支持GET请求


似乎
System.Net.HttpClient
类没有正确发送POST请求。

最常见的问题之一是没有使用适当的属性

考虑到ASP.NET MVC和ASP.NET Web API的属性具有相同的名称,但位于不同的名称空间中:

  • 您必须使用
    System.Web.Http
  • ,位于
    System.Web.MVc

这是一个非常常见的错误,它会影响MVC和WebAPI中存在的所有类型的东西。因此,在使用bith世界中可能存在的东西(例如过滤器、属性或依赖项注入注册)时,必须非常小心。

我遇到了类似的问题(但可能不是同一个问题)。在我的例子中,我没有给输入元素赋予name属性。我只是在fiddler显示没有将post数据发送到服务器时才发现了这一点(就像您的情况一样)


尝试将FromBody更改为FromUri

如果参数是“简单”类型,Web API将尝试从URI获取值。简单类型包括.NET基本类型(int、bool、double等),加上TimeSpan、DateTime、Guid、decimal和string,再加上任何带有可从字符串转换的类型转换器的类型


对于复杂类型,Web API尝试使用媒体类型格式化程序从消息体读取值。

完全删除
FromBody
,并且在传递参数时不做任何限制(此时可以在uri、查询字符串或表单提交(有点类似于查询字符串)中传递)


它将被隐式解析和传递。

谢谢。这是一个非常有用的建议。我刚刚检查了一下,属性都来自正确的位置,即Web API中的
System.Web.Http
命名空间。您能显示您的POST请求不起作用的样子吗?Fiddler默认情况下不会捕获本地主机流量。您是必须为它做点什么来捕获这种流量:你可以使用chrome扩展,如Postman、DHC或Advanced REST client来测试你的Web API。试试其中的任何一种,它们都非常有用,发出请求比使用Fiddler更容易。(我更喜欢Postman:)。这是很久以前的事了,但我几乎一字不差地遇到了完全相同的问题,你解决过这个问题吗?@NardDog:我不记得了,但我想是因为我的Newtonsoft.Json库没有正确加载到我的客户端应用程序中,我不得不更新它。我通过尝试/捕获并追踪每个
InnerException嵌套在主异常树中。
config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{action}/{id}",
            defaults: new { id = RouteParameter.Optional }
<input id="test" name="xyz" type="text" />
    [Route("name/add")]

    public async Task Post()
    {
        if (!Request.Content.IsMimeMultipartContent())
        {
            return;
        }

        var provider = PostHelper.GetMultipartProvider();
        var result = await Request.Content.ReadAsMultipartAsync(provider);
        var clientId = result.FormData["xyz"];
        ...
[HttpPost]
public string GetFoo(string foo){...}