2

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> 
4

2 に答える 2

2

WCF設定の素晴らしい世界へようこそ...

メッセージを失い始める前に、配列をどのくらい大きくすることができますか(つまり、正常に転送できる最大の配列はどれくらいですか)?

私の経験から、配列に関連する設定はmaxArrayLengthです(階層データを処理するmaxItemsInObjectGraphではありません)。この設定(およびmaxReceivedMessageSize )が、サーバー構成クライアント構成の両方でByteListの長さよりも大きいことを確認してください。

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に少なくとも1つのエラーメッセージが表示されるはずです。

于 2012-12-27T18:31:06.610 に答える
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>
于 2012-12-21T04:47:16.423 に答える