私は.NETのHttpClientを使用して、WebAPIにリクエストを行い、クライアントの側でカスタム逆シリアル化を少し必要とするJSONデータを返します。これについて私は自分自身でJsonConverter
を作ったが、ReadAsAsync<T>
メソッドがコンバータの存在を拾う方法を理解できない。.netカスタムJsonConverterを持つHttpClient
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());
}
はこれが私にできる最善である、またはいくつかのよりエレガントな方法はありますか?
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にはコンバーターという概念がありました。今は同じ仕事をすることができる3つのことがあります。派生したHttpContentクラス、派生MediaTypeFormatterおよび派生JsonConverter .... –
これは私が探していたものです。最終的に私はもともと持っていたものと一緒に行くつもりです。なぜなら、将来のリクエストでのフェールオーバーの場合にも、ディスク上にレスポンスをキャッシュする必要があるからです。 –
素敵です!他のJSON.NET設定をカスタマイズする必要がありました。これはパズルの欠けていた部分です:) –