簡體   English   中英

如何在DataServiceContext WCF數據服務客戶端中解碼gzip?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM