【发布时间】:2016-08-31 07:12:27
【问题描述】:
似乎我遇到了最基本的问题,但我找不到解决它所需的文档。
我有一个 mvc webapi 控制器:
public class TestController : ApiController
{
[HttpGet]
public MyClass Other([FromUri]MyClass id)
{
id.Value++;
return id;
}
}
public class MyClass
{
public int Value {get;set;}
}
我正在从 HttpClient 执行:
using (var client = new System.Net.Http.HttpClient())
{
client.BaseAddress = new System.Uri("http://localhost:31573/api/");
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
var obj = new MyClass { Value = 3 };
var data = JsonConvert.SerializeObject(obj);
StringContent queryString = new StringContent(data, Encoding.UTF8, "application/json");
var paramsValue = queryString.ReadAsStringAsync().Result;
var response = client.GetAsync("Test/?id="+ paramsValue).Result;
var textResponse = response.Content.ReadAsStringAsync().Result;
var result = JsonConvert.DeserializeObject<MyClass>(textResponse);
}
问题是控制器接收到的参数id是MyClass的默认实例(即Value = 0)。如果我将方法的原型更改为接受字符串:
[HttpGet]
public MyClass Other([FromUri]string id)
{
var val = JsonConvert.DeserializeObject<MyClass>(id);
val.Value++;
return val;
}
一切正常,但我宁愿不必在每个控制器方法中手动进行反序列化。
我已经尝试了很多如何创建查询字符串的组合,到目前为止都没有运气。
似乎数据正确地到达了webApi,但没有发生反序列化,所以我怀疑我没有正确配置webApi以使用json形式的请求参数。
我的 webapiconfig 看起来像:
public static void Register(HttpConfiguration config)
{
if (config == null)
throw new ArgumentNullException(nameof(config));
// Web API configuration and services
config.Formatters.Clear();
config.Formatters.Add(new JsonMediaTypeFormatter());
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional });
}
所以它返回的json正确,但是传入的参数没有正确反序列化。
谁能帮忙??
【问题讨论】:
标签: c# json asp.net-mvc-4 asp.net-web-api asp.net-web-api2