Dot-Net

.net HttpClient 與自定義 JsonConverter

  • July 11, 2016

我正在使用 .NET 的 HttpClient 向 WebAPI 發出請求,該 WebAPI 返回一些 JSON 數據,這些數據需要在客戶端進行一些自定義反序列化。為此,我製作了自己的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;
   }

您可以將JsonSerializerSettings您的轉換器列表傳遞給JsonMediaTypeFormatter將由以下人員使用的ReadAsAsync<T>

IE

var obj = await result.Content.ReadAsAsync<refsResponse>(
   new[] {new JsonMediaTypeFormatter {
         SerializerSettings = new JsonSerializerSettings { 
             Converters = new List<JsonConverter> {
               //list of your converters
              }
            } 
         }
   });

可能您想使用HttpClient.GetStringAsync Method (String)

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

或者你到底想要什麼更優雅?

引用自:https://stackoverflow.com/questions/13915485