Декомпрессия streamа GZip из ответа HTTPClient
Я пытаюсь подключиться к api, который возвращает JSON, закодированный GZip, из службы WCF (служба WCF для службы WCF). Я использую HTTPClient для подключения к API и смог вернуть объект JSON в виде строки. Однако мне нужно иметь возможность хранить эти возвращенные данные в базе данных, и поэтому я решил, что лучший способ – вернуть и сохранить объект JSON в массиве или байте или что-то в этом направлении.
У меня возникли проблемы с конкретным декомпрессией кодировки GZip, и вы пытались много разных примеров, но все же не можете получить ее.
Ниже приведен код, как я устанавливаю свое соединение и получаю ответ, это код, который возвращает строку из API.
- Каков наилучший способ обхода проблемы WCF с использованием `` `WCF?
- Сериализовать объекты Entity Framework в JSON
- Каковы различия между веб-службами WCF и ASMX?
- Максимальная длина длины строки содержимого (8192) была превышена при чтении XML-данных
- WCF ChannelFactory против генератора прокси
public string getData(string foo) { string url = ""; HttpClient client = new HttpClient(); HttpResponseMessage response; string responseJsonContent; try { client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); response = client.GetAsync(url + foo).Result; responseJsonContent = response.Content.ReadAsStringAsync().Result; return responseJsonContent; } catch (Exception ex) { System.Windows.Forms.MessageBox.Show(ex.Message); return ""; } }
Я слежу за несколькими различными примерами, такими как StackExchange API , MSDN и паролем в stackoverflow, но я не смог заставить кого-либо из них работать для меня.
Каков наилучший способ добиться этого, я даже на правильном пути?
Спасибо, парни.
- Подробное исследование исключения таймаута WCF
- Проблема десериализации с помощью DataContractJsonSerializer
- Эффективный способ отправки изображений через WCF?
- WCF: Показывать только свойства DataMember без набора?
- Шаблоны для компенсации отсутствия наследования в SOA
- Ошибка в клиенте WCF, использующем веб-службу Axis 2 с WS-Security. Имя пользователя: Token PasswordDigest.
- Как использовать веб-службу WCF через URL-адрес во время выполнения?
- Контракт-первая SOA: Проектирование бизнес-домена: WCF
Просто создайте экземпляр HttpClient следующим образом:
HttpClientHandler handler = new HttpClientHandler() { AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate }; using (var client = new HttpClient(handler)) { // your code }
Хорошо, поэтому я в конечном итоге решил свою проблему. Если есть лучшие способы, пожалуйста, дайте мне знать 🙂
public DataSet getData(string strFoo) { string url = "foo"; HttpClient client = new HttpClient(); HttpResponseMessage response; DataSet dsTable = new DataSet(); try { //Gets the headers that should be sent with each request client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); //Returned JSON response = client.GetAsync(url).Result; //converts JSON to string string responseJSONContent = response.Content.ReadAsStringAsync().Result; //deserializes string to list var jsonList = DeSerializeJsonString(responseJSONContent); //converts list to dataset. Bad name I know. dsTable = Foo_ConnectAPI.ExtentsionHelpers.ToDataSet(jsonList); //Returns the dataset return dsTable; } catch (Exception ex) { System.Windows.Forms.MessageBox.Show(ex.Message); return null; } } //deserializes the string to a list. Utilizes JSON.net. RootObject is a class that contains the get and set for the JSON elements public List DeSerializeJsonString(string jsonString) { //Initialized the List List list = new List (); //json.net deserializes string list = (List )JsonConvert.DeserializeObject>(jsonString); return list; }
RootObject содержит набор get, который получит значения JSON.
public class RootObject { //These string will be set to the elements within the JSON. Each one is directly mapped to the JSON elements. //This only takes into account a JSON that doesn't contain nested arrays public string EntityID { get; set; } public string Address1 { get; set; } public string Address2 { get; set; } public string Address3 { get; set; } }
Самый простой способ создать вышеупомянутый class – это использовать json2charp, который будет соответствующим образом отформатировать его, а также предоставить правильные типы данных.
Далее из другого ответа на Stackoverflow снова не учитывается вложенный JSON.
internal static class ExtentsionHelpers { public static DataSet ToDataSet(this List list) { try { Type elementType = typeof(RootObject); DataSet ds = new DataSet(); DataTable t = new DataTable(); ds.Tables.Add(t); try { //add a column to table for each public property on T foreach (var propInfo in elementType.GetProperties()) { try { Type ColType = Nullable.GetUnderlyingType(propInfo.PropertyType) ?? propInfo.PropertyType; t.Columns.Add(propInfo.Name, ColType); } catch (Exception ex) { System.Windows.Forms.MessageBox.Show(ex.Message); } } } catch (Exception ex) { System.Windows.Forms.MessageBox.Show(ex.Message); } try { //go through each property on T and add each value to the table foreach (RootObject item in list) { DataRow row = t.NewRow(); foreach (var propInfo in elementType.GetProperties()) { row[propInfo.Name] = propInfo.GetValue(item, null) ?? DBNull.Value; } t.Rows.Add(row); } } catch (Exception ex) { System.Windows.Forms.MessageBox.Show(ex.Message); } insert.insertCategories(t); return ds. } catch (Exception ex) { System.Windows.Forms.MessageBox.Show(ex.Message); return null; } } };
Затем, наконец, чтобы вставить вышеуказанный dataset в таблицу со столбцами, которые были сопоставлены с JSON, я использовал объемную копию SQL и следующий class
public class insert { public static string insertCategories(DataTable table) { SqlConnection objConnection = new SqlConnection(); //As specified in the App.config/web.config file objConnection.ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["foo"].ToString(); try { objConnection.Open(); var bulkCopy = new SqlBulkCopy(objConnection.ConnectionString); bulkCopy.DestinationTableName = "dbo.foo"; bulkCopy.BulkCopyTimeout = 600; bulkCopy.WriteToServer(table); return ""; } catch (Exception ex) { System.Windows.Forms.MessageBox.Show(ex.Message); return ""; } finally { objConnection.Close(); } } };
Таким образом, вышеприведенная работа заключается в том, чтобы вставить JSON из webAPI в базу данных. Это то, что я получаю, чтобы работать. Но отнюдь не ожидаю, что это будет идеально. Если у вас есть какие-либо улучшения, пожалуйста, обновите их соответствующим образом.