2012-12-21 80 views
2

發送更大的字節數組我有一個WCF服務和我發送以下datacontract不能夠在WCF

[DataContract] 
public class Sample 
{ 
    [DataMember] 
    public int Type { get; set; } 

    [DataMember] 
    public string Name { get; set; } 

    [DataMember] 
    public string Value { get; set; } 

    [DataMember] 
    public byte[] ByteList { get; set; } 
} 

但作爲字節數組的大小增加了客戶端不接受該數據。其他消息已成功接收。我試着在.config中增加大小。我也嘗試使用DataContractSerializer序列化後發送對象,但沒有爲我工作。我知道我身邊有一些錯誤,但我無法弄清楚。請讓我知道您的意見

<netTcpBinding> 
    <binding name="tcpbinding" closeTimeout="00:01:00" 
     openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" 
     transactionFlow="false" transferMode="Buffered" transactionProtocol="OleTransactions" 
     hostNameComparisonMode="StrongWildcard" listenBacklog="10" 
     maxBufferPoolSize="524288" maxBufferSize="2147483646" maxConnections="10" 
     maxReceivedMessageSize="2147483646"> 
     <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" /> 
     <reliableSession ordered="true" inactivityTimeout="00:10:00" 
      enabled="true" /> 
     <security mode="None"> 
     <transport clientCredentialType="Windows" protectionLevel="EncryptAndSign"/> 
     <message clientCredentialType="Windows"/> 
     </security> 
    </binding> 
    </netTcpBinding> 
+0

你看到的確切異常是什麼(包括任何內部異常)? –

+0

我沒有收到任何例外。它只是我沒有收到消息。服務器正在發送消息,但它在回調事件中沒有收到。但我同時收到其他消息。此外,如果字節數組的大小更小,我收到消息。 – Sunil

+0

奇怪...嘗試在客戶端上啓用跟蹤並查看跟蹤(特別是查找可能被吞噬的任何異常)。見例如http://blogs.msdn.com/b/madhuponduru/archive/2006/05/18/601458.aspx –

回答

1

歡迎的WCF設置的奇妙世界......

可以有多大的陣列在你開始丟失信息之前(即你能成功傳輸的最大陣列是什麼)?

根據我的經驗,與陣列有關的設置是maxArrayLength(不是maxItemsInObjectGraph,它處理分層數據)。確保此設置(以及maxReceivedMessageSize)大於服務器客戶端配置中的任何字節列表長度。

WCF很好地隱藏了它的錯誤信息,但你可以設置跟蹤來找到它們。在服務器,在web.config文件中添加此配置節點下:

<system.diagnostics> 
    <trace autoflush="true" /> 
    <sources> 
    <source name="System.ServiceModel.MessageLogging"> 
     <listeners> 
     <add name="messages" 
      type="System.Diagnostics.XmlWriterTraceListener" 
      initializeData="c:\logs\messages.svclog" /> 
     </listeners> 
    </source> 
    <source name="System.ServiceModel" 
      switchValue="Warning, Critical, Error, Verbose" 
      propagateActivity="true"> 
     <listeners> 
     <add name="sdt" 
      type="System.Diagnostics.XmlWriterTraceListener" 
      initializeData= "c:\logs\service.svclog" /> 
     </listeners> 
    </source> 
    </sources> 
</system.diagnostics> 

<system.serviceModel> 
    <diagnostics> 
    <messageLogging 
     logEntireMessage="true" 
     logMalformedMessages="true" 
     logMessagesAtServiceLevel="true" 
     logMessagesAtTransportLevel="true" 
     maxMessagesToLog="3000000" 
     maxSizeOfMessageToLog="2000000"/> 
    </diagnostics> 
</system.serviceModel> 

注意

  • 您必須手動創建日誌文件夾(在這裏:C: \ logs)首先在服務器上。
  • 通過這些設置,日誌文件(特別是service.svclog)非常快速地增長。只有當你真的需要它時纔開啓這種日誌記錄。

參考

後者還說明了如何打開和讀取日誌文件。在進行不返回消息的服務調用後,您應該在service.svclog中看到至少一條錯誤消息。

+0

謝謝sphinxxx的解釋 – Sunil

0

只需添加

<httpRuntime maxRequestLength="2048000" executionTimeout="3600" /> 

到你的配置。

如果不能解決問題,再加入

<dataContractSerializer maxItemsInObjectGraph="2147483647"/> 

太像下面

<behaviors> 
     <serviceBehaviors>   
     <behavior name="myNetTcpBehaviour"> 
      <serviceMetadata httpGetEnabled="true"/> 
      <serviceDebug includeExceptionDetailInFaults="true"/> 
      <dataContractSerializer maxItemsInObjectGraph="2147483647"/> 
     </behavior> 
     </serviceBehaviors> 
     <endpointBehaviors> 
     <behavior name="myNetTcpEndPointBehaviour"> 
      <dataContractSerializer maxItemsInObjectGraph="2147483647"/> 
     </behavior> 
     </endpointBehaviors> 
    </behaviors> 
+0

感謝您的答覆..但它會工作,因爲我使用nettcpbinding和httpGetEnabled應該是「false」。我應該添加 Sunil

+0

標籤 – Anu

+0

也主要是添加,「httpGetEnabled = true」在我的代碼只是一個例如: – Anu