Я не мог понять, как это сделать с помощью предоставленных инструментов инфраструктуры, поэтому мне пришлось свернуть свои собственные.Во-первых, это метод, который выполняет фактический запрос, который показывает, как указать заголовок, который запрашивает кодировку gzip
и распаковывает результат.
private static IEnumerable<dynamic> MakeHttpQuery(string uri)
{
var request = (HttpWebRequest)WebRequest.Create(new Uri(uri));
request.Method = "GET";
request.Accept = "application/json";
request.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip");
try
{
var response = request.GetResponse();
var contentEncoding = response.Headers[HttpResponseHeader.ContentEncoding];
var responseStream = response.GetResponseStream();
if (!string.IsNullOrEmpty(contentEncoding) && contentEncoding.Equals("gzip"))
{
responseStream = new GZipStream(responseStream, CompressionMode.Decompress);
}
var json = JsonObject.Parse(responseStream);
var d = json["d"];
if (!d.IsArray) return new JsonArray(new[] {d}).Values;
else return ((JsonArray) d).Values;
}
catch (WebException webException)
{
log4net.LogManager.GetLogger(typeof(ProfileMediaDataInterface)).Error(webException);
return new JsonArray(new JsonValue[] {}).Values;
}
}
Библиотека DynamicJson - это библиотека с открытым исходным кодом, которую я недавно написал и которая очень пригодилась здесь.Вы можете очень легко пропустить заголовок Accept: application/json
, и тогда вы получите обратно XML.В этом случае что-то вроде linq-to-xml
также будет работать, почти таким же образом.
Далее код клиента.Здесь показано, как создать URL-адрес для передачи методу MakeHttpQuery
, а также что делать с результатом.
public static List<BenchmarkListSqr> GetBenchmarkListSqr(string currencyCode)
{
return
MakeHttpQuery(
CreateDataService()
.BenchmarkList
.Where(bm => bm.Currency == currencyCode)
.ToString())
.Select(x => new BenchmarkListSqr(
x.Currency,
x.AssetClass,
ToNullDateTime(x.AvailableFromDate),
x.ID,
ToNullDateTime(x.InceptionDate),
x.Name,
x.Region,
ToNullDecimal(x.ShareID)))
.ToList();
}