2016-11-02 39 views
1

如何告知dotNetRDF請求並接受來自使用gzip編碼響應的遠程triplestore的數據?使用dotNetRDF接收gzip內容編碼

查看SparqlHttpProtocolConnector的LoadGraph方法的源代碼,它似乎沒有設置Accept-Encoding標頭的機制,也沒有看到任何處理Content-Encoding標頭的邏輯。

我試圖修改LoadGraph設置接受編碼,然後將內容回來與正確的內容類型和內容編碼,但代碼確定如何處理響應線路

IRdfReader parser = MimeTypesHelper.GetParser(response.ContentType); 

並且GetParser沒有任何考慮內容編碼的邏輯。

但是,它看起來像是件:當然有基礎設施來處理gzip文件。

是否有另一種方法來做到這一點,我錯過了,或者這是一個新的功能要求?

謝謝。

回答

2

您可以擴展SPARQLHttpProtocolConnector,然後覆蓋ApplyCustomRequestOptions方法以應用Accept-Encoding標頭。

儘管MimeTypesHelper不會在響應的Content-Encoding標頭上進行區分,但您可以改用HttpWebRequest.AutomaticDecompression Property來啓用自動解壓縮響應流。再次,這可以在ApplyCustomRequestOptions方法中設置。

所以,你的擴展類會是這樣的:

public class CompressedSparqlHttpProtocolConnector : SparqlHttpProtocolConnector 
{ 
    // Define appropriate constructors with the parameters you need e.g. 
    public CompressedSparqlHttpProtocolConnector(Uri serviceUri) 
: base(serviceUri) { }  

    protected override ApplyCustomRequestOptions(HttpWebRequest request) 
    { 
    // Request GZip encoded response, allow fallback to identity encoding 
    request.Headers[HttpRequestHeader.ContentEncoding] = "gzip;q=1.0, identity;q=0.5" 

    // Enable automatic decompression of the response 
    request.AutomaticDecompression = DecompressionMethods.GZip; 
    } 
} 
+0

感謝您的答覆。但是ApplyCustomRequestOptions在抽象類BaseEndpoint中定義,它不是SparqlHttpProtocolConnector的基類之一。 (SparqlHttpProtocolConnector派生自BaseHttpConnector,其中包括ApplyRequestOptions,但該方法不能被覆蓋。) – MWood

+0

另外,您的意思是HttpRequestHeader.AcceptEncoding? 作爲解決方法,我按照您的建議創建了派生類,但是從SparqlHttpProtocolConnector中提取了整個LoadGraph功能,添加了上述功能。 感謝您指點我正確的方向。 – MWood

相關問題