对 Web API 的简单 POST 请求根本没有命中 API

问题描述 投票:0回答:4

在我的 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;

这是我的

WebAPIClient
类的代码:

public class WebAPIClient
{
    private string _baseUri = null;

    public WebAPIClient()
    {
        // TO DO: Make this configurable
        _baseUri = "http://localhost:54488/";
    }

    public async Task<R> PostAsXmlAsync<T, R>(string uri, T value)
    {
        using (var client = new HttpClient())
        {
            client.BaseAddress = new Uri(_baseUri);

            client.DefaultRequestHeaders.Accept.Clear();
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/xml"));

            var requestUri = new Uri(client.BaseAddress, uri);

            var response = await client.PostAsXmlAsync<T>(requestUri, value);

            response.EnsureSuccessStatusCode();

            var taskOfR = await response.Content.ReadAsAsync<R>();

            return taskOfR;
        }
    }
}

我为 Web API 定义了以下默认路由:

config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{action}/{id}",
            defaults: new { id = RouteParameter.Optional }

更新 我的代码会进入调试器,直到调用

PostAsXmlAsync
代码上的
System.Net.HttpClient
方法。但是,Fiddler 中没有显示任何请求。

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

看起来

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

asp.net asp.net-mvc asp.net-web-api dotnet-httpclient
4个回答
0
投票

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

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

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


0
投票

我遇到了类似的问题(但可能不是同一个问题)。就我而言,我没有为输入元素指定 name 属性。我只是在提琴手显示没有发送数据到服务器时才发现这一点(就像你的情况一样)

<input id="test" name="xyz" type="text" />

在输入标签中添加 name 属性解决了我的问题。

不过,还有一件事需要注意。 WebAPI 不会直接将表单数据放入参数中。您必须创建一个具有这些属性的对象并将该对象放入后控制器的参数中。或者你可以像这样根本不输入任何参数:

    [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"];
        ...

0
投票

尝试将 FromBody 更改为 FromUri。

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

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


0
投票

完全删除

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

[HttpPost]
public string GetFoo(string foo){...}

它将被隐式解析并传递。

© www.soinside.com 2019 - 2024. All rights reserved.