![](/img/trans.png)
[英]System.Data.Services.Client.DataServiceContext Timeout Property is Not Working
[英]How can I decode gzip in a DataServiceContext WCF Data Services client?
我們有一個數據服務提供商,可以在WCF數據服務站點上為我們提供動態壓縮。 我們需要利用這種壓縮,因為我們每天提取的原始數據超過5Gb。 使用gzip將大大降低。
我們有一個客戶端應用程序,它是使用Visual Studio 2010中的“添加服務引用”向導基於DataServiceContext類創建的。 我可以使用SendingRequest
事件指定Accept: gzip, deflate
標頭,但是如何在嘗試解析XML之前讓解串器對流進行解碼?
在要獲取壓縮數據的SendingRequest中設置的同一位置,只需添加以下內容:
e.RequestHeaders.Add("Accept-Encoding","gzip, deflate");
((System.Net.HttpWebRequest)e.Request).AutomaticDecompression =
(System.Net.DecompressionMethods.GZip |
System.Net.DecompressionMethods.Deflate);
參考: http : //social.msdn.microsoft.com/Forums/en/adodotnetdataservices/thread/65127110-1213-45fa-a2ef-8bbd069d1294
我無法弄清楚如何使用提供的框架工具來做到這一點,所以我不得不自己動手做。 首先是執行實際請求的方法,該方法顯示了如何指定請求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
東西也將以相同的方式工作。
接下來是客戶端代碼。 這顯示了如何構造要傳遞給MakeHttpQuery
方法的URL以及如何處理結果。
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();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.