16

私は .NET の HttpClient を使用して、クライアント側でカスタムの逆シリアル化を少し必要とする JSON データを返す WebAPI にリクエストを作成しています。このために私は自分で を作成しましたが、メソッドがコンバーターの存在を取得する方法 JsonConverterがわかりません。ReadAsAsync<T>

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;
    }
4

3 に答える 3

16

によって使用されるJsonSerializerSettingsに、コンバーターのリストとともにを渡すことができます。JsonMediaTypeFormatterReadAsAsync<T>

すなわち

var obj = await result.Content.ReadAsAsync<refsResponse>(
    new[] {new JsonMediaTypeFormatter {
          SerializerSettings = new JsonSerializerSettings { 
              Converters = new List<JsonConverter> {
                //list of your converters
               }
             } 
          }
    });
于 2012-12-17T15:17:54.740 に答える
2

HttpClient.GetStringAsync メソッド (文字列)を使用したい場合があります。

var response = client.GetStringAsync("api/sites/" + sid);
return JsonConvert.DeserializeObject<PrefsResponse>(response.Result, new  PrefClassJsonConverter());

または、正確に何をよりエレガントにしたいですか?

于 2012-12-17T14:31:00.060 に答える
1

次のようにして、カスタム JsonConverter を HttpClient のデフォルトのフォーマッタに追加できました。

MediaTypeFormatterCollection formatters = new MediaTypeFormatterCollection(); 
formatters.JsonFormatter.SerializerSettings.Converters.Add(new MyCustomConverter());


var result = response.Content.ReadAsAsync<T>(formatters).Result;

これにより、カスタム コンバーターをデフォルトのコンバーターに追加することができるように見えました。

于 2016-07-11T09:34:28.523 に答える