【问题标题】:A simple POST request to Web API not hitting the API at all一个简单的对 Web API 的 POST 请求根本没有命中 API
【发布时间】:2014-06-30 00:46:09
【问题描述】:

从我的 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 }

更新 我的代码会进入调试器,直到调用 System.Net.HttpClient 代码上的 PostAsXmlAsync 方法。但是,Fiddler 中没有显示任何请求。

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

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

【问题讨论】:

  • 你能展示一下你的 POST 请求不起作用的样子吗?
  • Fiddler 默认不捕获本地主机流量。你必须为它做点什么来捕获这个流量:docs.telerik.com/fiddler/Configure-Fiddler/Tasks/…
  • 您可以使用 chrome 扩展程序,如 Postman、DHC 或 Advanced REST 客户端,来测试您的 Web API。尝试其中的任何一个,它们都非常有帮助,并且使用 Fiddler 更容易提出请求。 (我更喜欢邮递员:chrome.google.com/webstore/detail/postman-rest-client/…)。
  • 这是很久以前的事了,但我几乎逐字逐句地遇到完全相同的问题,你有没有解决过这个问题?
  • @NardDog:我不记得了,但我认为我的 Newtonsoft.Json 库没有正确加载到我的客户端应用程序中,我必须更新它。我通过尝试/捕获并追逐嵌套在主异常树中的每个 InnerException 来了解。

标签: asp.net asp.net-mvc asp.net-web-api dotnet-httpclient


【解决方案1】:

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

考虑到 ASP.NET MVC 和 ASP.NET Web API 存在同名但位于不同命名空间中的属性:

  • For Web API你必须使用System.Web.Http中的那个
  • For MVCSystem.Web.MVc 中的那个

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

【讨论】:

  • 谢谢。这是非常有用的建议。我刚刚检查了一下,所有属性都来自正确的位置,即来自 Web API 中的 System.Web.Http 命名空间。
【解决方案2】:

我遇到了类似的问题(虽然可能不一样)。在我的例子中,我没有为 input 元素赋予 name 属性。我只是在提琴手显示没有发送到服务器的帖子数据时才发现这一点(就像你的情况一样)

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

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

但是,还有一点需要注意。 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"];
        ...

【讨论】:

    【解决方案3】:

    尝试将 FromBody 更改为 FromUri。

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

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

    【讨论】:

      【解决方案4】:

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

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

      它将被隐式解析并传递。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-03-11
        • 1970-01-01
        • 2013-04-19
        • 1970-01-01
        • 1970-01-01
        • 2018-10-30
        • 2017-04-30
        相关资源
        最近更新 更多