我正在使用.NET的HttpClient向WebAPI发出请求,返回一些JSON数据,需要在客户端一点点的自定义反序列化。为此,我制作了自己的JsonConverter
,但我无法弄清楚如何使ReadAsAsync<T>
方法获得转换器的存在。.net HttpClient与自定义JsonConverter
我已经解决了我的问题,现在使用ReadAsStringAsync
来读取响应,然后将该字符串传递给JsonConvert.DeserializeObject
,但似乎应该有一个更优雅的解决方案。
这里是我的代码:
public PrefsResponse GetAllPrefs(string sid) {
HttpClient client = CreateHttpClient(null, sid);
var response = client.GetAsync("api/sites/" + sid).Result;
// TODO : find a way to hook custom converters to this...
// return response.Content.ReadAsAsync<PrefsResponse>().Result;
var stringResult = response.Content.ReadAsStringAsync().Result;
return JsonConvert.DeserializeObject<PrefsResponse>(stringResult, new PrefClassJsonConverter());
}
这是我能做的最好的,或者是有一些更优雅的方式?
这里就是我创建HttpClient的同时,如果这就是我需要把它挂:
private HttpClient CreateHttpClient(CommandContext ctx, string sid) {
var cookies = new CookieContainer();
var handler = new HttpClientHandler {
CookieContainer = cookies,
UseCookies = true,
UseDefaultCredentials = false
};
// Add identity cookies:
if (ctx != null && !ctx.UserExecuting.IsAnonymous) {
string userName = String.Format("{0} ({1})", ctx.RequestingUser.UserName, ctx.UserExecuting.Key);
cookies.Add(new Cookie(__userIdCookieName, userName));
cookies.Add(new Cookie(__sidCookieName, sid));
cookies.Add(new Cookie(__hashCookieName,
GenerateHash(userName, Prefs.Instance.UrlPrefs.SharedSecret)));
}
var client = new HttpClient(handler) {
BaseAddress = _prefServerBaseUrl
};
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
return client;
}
我不知道JSON.Net有它自己的转换器的概念!所以现在我们有三件事可以做同样的工作。派生的HttpContent类,派生的MediaTypeFormatters和派生的JsonConverter .... –
这就是我正在寻找。最终,我会尽我所能,因为我还需要将响应缓存在磁盘上,以防未来请求发生故障。 –
太棒了!我需要定制一些其他的JSON.NET设置,这是我的谜题的缺失:) –