2012-07-24 62 views
2

如何爲自託管WCF服務添加可選gzip壓縮?我正在使用這個senario WebHttpBinding。我想檢查Accept標題是否包含字符串gzip並壓縮比內容。向自託管WCF服務添加可選gzip壓縮

我想使用自定義屬性。到目前爲止,我使用自定義屬性允許我在XML和JSON輸出之間切換,但我現在不知道如何壓縮輸出。

在我的編碼器開關屬性中,我實現了IDispatchMessageFormatter接口以根據需要更改XmlObjectSerializer。但是我並不介意如何生成輸出來修改它。

如果有人能指出我可能的解決方案,這將是很好的。

+0

有趣的問題。爲什麼它必須是可選的?只是好奇。我認爲gzip壓縮是幾乎所有使用http的設備都支持的標準,因此我託管的WCF服務在IIS配置級別執行。 – Scen 2012-07-24 16:18:14

+0

這將是很好的,所以通過telnet測試服務更容易。另外我不確定第三方客戶端是否容易處理壓縮。 – rekire 2012-07-24 16:21:55

+0

啊,你可能想試試Fiddler(http://www.fiddler2.com/fiddler2/)來測試你的WCF http服務。這很棒。我還沒有運行過不會自動解壓縮gzip的設備,但我想我不能肯定地說所有第三方客戶端都可以處理它。 – Scen 2012-07-24 16:25:10

回答

4

這不是一個屬性,但它是壓縮WCF服務響應的基本代碼,並且如果需要可以封裝到屬性中。

public static void CompressResponseStream(HttpContext context = null) 
{ 
    if (context == null) 
     context = HttpContext.Current; 

    string encodings = context.Request.Headers.Get("Accept-Encoding"); 

    if (!string.IsNullOrEmpty(encodings)) 
    { 
     encodings = encodings.ToLowerInvariant(); 

     if (encodings.Contains("deflate")) 
     { 
      context.Response.Filter = new DeflateStream(context.Response.Filter, CompressionMode.Compress); 
      context.Response.AppendHeader("Content-Encoding", "deflate"); 
      context.Response.AppendHeader("X-CompressResponseStream", "deflate"); 
     } 
     else if (encodings.Contains("gzip")) 
     { 
      context.Response.Filter = new GZipStream(context.Response.Filter, CompressionMode.Compress); 
      context.Response.AppendHeader("Content-Encoding", "gzip"); 
      context.Response.AppendHeader("X-CompressResponseStream", "gzip"); 
     } 
     else 
     { 
      context.Response.AppendHeader("X-CompressResponseStream", "no-known-accept"); 
     } 
    } 
} 

[編輯],以解決意見:

只要任何地方調用它在你的Web服務操作的主體,因爲它設置了響應性能:

[OperationContract] 
public ReturnType GetInformation(...) { 
    // do some stuff 
    CompressResponseStream(); 
} 
+0

我放棄了那個項目,但看起來非常好。如果你可以提供一個例子,你的函數應該被調用,我會接受你的答案。 – rekire 2013-04-17 15:13:59

+0

@rekire:如你所願...... – 2013-04-17 21:22:37