在搜索网页并尝试许多不同的解决方案后,我无法解决这个问题。 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调用的参数。谁能告诉我我做得不对?