使用 HTTPClient.PostAsync 调用 ASP.Net RESTful POST 控制器 API 方法

Calling an ASP.Net RESTful POST controller API method with HTTPClient.PostAsync

一位同事编写了一个 Azure 移动服务API,其中包括以下控制器方法:

public class SegmentationController : ApiController
{
    // [...]

    // POST api/<controller>/id
    public async Task<string> Post(string id)
    {
        // [...]

我正在尝试从 Windows 通用应用程序调用它。对 GET 方法的调用没有问题,但我无法调用 POST 方法。这是我尝试过的:

response = await client.PostAsync("api/segmentation/", new StringContent(item.Id));
    // 405 Method Not Allowed

response = await client.PostAsync("api/segmentation/" + item.Id, new StringContent(""));
    // 500 Internal Server Error

response = await client.PostAsync("api/segmentation/", new StringContent("id=" + item.Id));
    // 405 Method Not Allowed

response = await client.PostAsync("api/segmentation/", new StringContent("{\"id\":" + item.Id + "}"));
    // 405 Method Not Allowed 

(N.B。Marc's answer 中使用的 System.Collections.Specialized.NameValueCollection 在 WinRT / Windows Universal 上不可用。)

有可能我的第二次调用是正确的,错误在服务器端代码中;我们正在探索这种可能性。

对 ASP.Net RESTful API 方法进行 POST 调用的正确方法是什么,该方法需要一个名为 "id" 类型的参数 string?

你的参数有问题。您有两个选择:

  1. 使用查询参数而不是正文。例如api/segmentation?id=abc
  2. [FromBody] 属性添加到您的参数。例如public async Task<string> Post([FromBody]string id)
    现在你的参数是从正文中读取的。默认情况下,仅从正文中读取复杂类型。

有关详细信息,请参阅 Parameter Binding in ASP.NET Web API

这是服务器错误。添加错误报告代码后,我们可以看到问题是由于 Azure 上的 x64 / x86 不匹配,服务器无法加载它所依赖的 C++ DLL。现在有效的调用方式是我在问题中列出的第二个:

response = await client.PostAsync("api/segmentation/" + item.Id, new StringContent(""));