2015-04-03 28 views
2

我們需要爲低帶寬網絡創建WCF服務。所以我們的目標是創建每個調用產生最少字節數的綁定配置。這是在app.config根據傳輸的字節總數,最緊湊的wcf綁定是什麼?

<customBinding> 
    <binding name="binaryBinding"> 
    <binaryMessageEncoding/> 
    <tcpTransport /> 
    </binding> 
</customBinding> 

摘錄我認爲建立一個連接的開銷介紹一樣,所以我們會保持這種降到最低。一個典型的情況是

Client.Connect(); 
while (!userTerminates()) 
{ 
    var Response = Client.DoSomething(parameters); 
    <user input> 
    var anotherResponse = Client.DoSomethingElse(otherParameters); 
} 
Client.Close(); 

數據發送/接收到一些20字節變化到一對夫婦的100

到目前爲止,我設法安裝WCF使用NetTcpBinding的和二進制編碼,但我還是有400%的開銷。我發送了一個由600個字符組成的單個字符串,並且收到了2200個字符。我通過使用一個MessageInspector來測量它,它測量傳入和傳出消息的長度。我假設開銷來自SOAP消息。 編輯:也許我的測量是錯誤的。

我也明白,我可以壓縮通信,如WCF示例庫中所示。 GoogleProtocol似乎也是一種選擇。

但我想從頭開始:如何修改配置(或最終創建自己的協議)以最小化發送的總字節數。目前安全性不是問題,性能也不是問題,它只是我感興趣的發送/接收字節數。

感謝您的任何提示。

回答

2

你是對的在那netTcp uses SOAP,這可能確實會導致你的20字節有效載荷膨脹到更多。

如何應用自定義綁定在CodeProject: CompactMessageEncoder 中進行了說明。如果有效負載是類似對象的,並且您沒有調用許多差異方法,則可以使用Google's Protocol Bufferscustom framing protocol over sockets

+0

我看着在MessageInspector的消息,並看到了SOAP消息(至少我認爲他們是)。本文:http://www.c-sharpcorner.com/uploadfile/pjthesedays/wcf-service-binding-explained/還指出netTcp(綁定)使用SOAP消息。 無論如何,非常感謝您的鏈接。我認爲會包括一些基本框架,但我想我必須建立自己的框架。 – alzaimar 2015-04-03 10:32:27

+0

@alzaimar你是對的,請參閱編輯。 – CodeCaster 2015-04-03 10:45:28

1

開銷是由WCF將對象序列化爲XML流的事實引起的。這意味着它不會假定它序列化的字段的順序或格式,並且需要提供這些信息和消息。二進制消息編碼器使用XmlDictionaryReader/Writer來序列化消息並使用字典查找在會話中早先發送的字段。但是,在某些時候,這些信息會在客戶端和服務器之間傳輸,這會導致額外的字節數據傳輸,具體取決於數據合同的大小。

要減少有效負載,請考慮編寫您自己的序列化程序,如下所示:http://www.codeproject.com/Articles/434665/WCF-Serialization-A-Case-Study

你也可以考慮在單場系列化包裝前在OnSerializing您的數據和OnDeserialized像這樣的方法:

[DataContract] 
public class Data 
{ 
    [DataMember] 
    private byte data; 

    private bool bool1; 
    private bool bool2; 

    [OnSerializing] 
    internal void OnSerializing() 
    { 
     data = Convert.ToByte((bool1 ? 0 : 1) & (bool2 ? 0 : 2)); 
    } 

    [OnDeserialized] 
    internal void OnDeserializing() 
    { 
     bool1 = (Convert.ToInt32(data) & 1) != 0; 
     bool2 = (Convert.ToInt32(data) & 2) != 0; 
    } 
} 
+0

這是我想避免的解決方案。但它應該工作,謝謝。 – alzaimar 2015-04-03 13:01:25

相關問題