使用HttpClient.PostAsJsonAsync到WebApi Rest服务无法提供复杂类型(Monotouch / iOS)

时间:2014-06-12 09:37:17

标签: c# ios asp.net-web-api httpclient complextype

在搜索网页并尝试许多不同的解决方案后,我无法解决这个问题。 3天后,我正在寻求SO集体的智慧和经验。

我在Visual Studio 2013中有一个WebApi。一种方法的接口是:

public Product[] SearchProducts([FromBody]DistanceBasedSearchArgs args) 
{
      ...

}

参数是复杂类型(类)。有一个基本的SearchArgs类和一个带有其他搜索详细信息的后代类:

public class SearchArgs
{
    public string Keyword { get; set; }
    public int Page { get; set; }
    public int PageSize { get; set; }
}

public class DistanceBasedSearchArgs : SearchArgs
{
    public int MaxDistance { get; set;}
}

我已在Visual Studio 2013中在Windows上测试了此设置。我已编写单元测试以使用HttpClient调用此API并将其修改为HTML页面发布。所有这一切都很完美。

我认为现在将这些代码复制到Xamarin Studio 3以允许我的iOS应用程序调用WebApi会很简单。这是代码:

public static async Task<ProductSearchResult[]> SearchProducts(DistanceBasedSearchArgs args) 
{
    using (HttpClient client = new HttpClient (new NativeMessageHandler (true))) 
{
       HttpResponseMessage response = await client.PostAsJsonAsync ("http:///thehost.com:1234", args);
   return response.Content.ReadAsAsync<ProductSearchResult[]>().Result;
}

问题是,当调用WebApi方法时,复杂类型DistanceBasedSearchArgs未在服务器端正确反序列化。所有值都是默认值(即MaxDistance始终为0,即使在客户端,它的值为25.

我在Max / iOS端使用了CharlesProxy来捕获requeset。该请求似乎发布了正确的JSON。以下是CharlesProxy捕获的内容:

URL                 http://thehost.com:1234/api/Product/SearchProducts/
Status          Complete
Response Code   200 OK
Protocol            HTTP/1.1
Method          POST
Kept Alive          No
Content-Type    application/json; charset=utf-8
Client Address  /127.0.0.1
Remote Address  thehost.com/thehost.com (ips replaced)

&#34;请求&#34;下的JSON文本; JSON捕获的标签:

{
    "MaxDistance": 25,
    "Keyword": "Sushi",
    "Page": 1,
    "PageSize": 25
} 

但是,我传递给方法的参数没有正确反序列化。仅在从iOS应用程序进行调用并使用Post..Async方法时,这是一个问题。我只是得到一个默认值的类。如前所述,它在使用HttpClient的Windows单元测试中完美运行。以下是我尝试过的事情:

1)使用HTTP get传递参数就好了。

2)使用了查询字符串,它也传递了params。

3)使用Method.Post尝试RestSharp并且在args中正常传递(args在服务器端具有正确的值)。

4)我尝试过来自System.Net的HTTPClient,来自Nuget Packages HttpClient(v2.2.22)和WebApi Client(v5.1.2),ModernHttpClient。

我无法弄清楚为什么调用PostAsJasonAsync不能正确传递正文中的JSON以用作webapi调用的参数。谁能告诉我我做得不对?

0 个答案:

没有答案