セルフホスティングのTCP WCFサービスに)大きな文字列(24,000〜50,000文字)を渡そうとしています。
MaxStringContentLength(どこでも)を22008192に引き上げました。
BindingConfigurationを「LargeBuffer」または「LongFields」に変更する必要があることをどこかで読みましたが、これを行うと:
<endpoint address="" binding="netTcpBinding" bindingConfiguration="LongFields"
contract="ExStreamWCF.IService1">
またはこれ:
<endpoint address="" binding="netTcpBinding" bindingConfiguration="LargeBuffer"
contract="ExStreamWCF.IService1">
サービスが開始されません。このエラーを解消するには本当に必要です。何か案は?
おかげで、
ジェイソン
PS-サーバー上のtcpサービスからの構成ファイル:
<system.serviceModel>
<services>
<service behaviorConfiguration="ExStreamWCF.Service1Behavior"
name="ExStreamWCF.Service1">
<endpoint address="" binding="netTcpBinding" bindingConfiguration=""
contract="ExStreamWCF.IService1">
<identity>
<dns value="Devexstream-2.anchorgeneral.local" />
<!--<dns value="vmwin2k3sta-tn2" />-->
</identity>
</endpoint>
<endpoint address="mex" binding="mexTcpBinding" bindingConfiguration=""
contract="IMetadataExchange" />
<Host>
<baseAddresses>
<add baseAddress="net.tcp://Devexstream-2:8080/Service" />
<!--<add baseAddress="net.tcp://vmwin2k3sta-tn2:8080/Service" />-->
</baseAddresses>
</Host>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="ExStreamWCF.Service1Behavior">
<serviceMetadata httpGetEnabled="false" />
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
</serviceBehaviors>
</behaviors>
編集:要求されたバインディング
<system.serviceModel>
<bindings>
<netTcpBinding>
<binding name="NetTcpBinding_IService1" 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="2565536" maxConnections="10" maxReceivedMessageSize="2565536">
<readerQuotas maxDepth="22008192" maxStringContentLength="22008192" maxArrayLength="2516384"
maxBytesPerRead="22008192" maxNameTableCharCount="22008192" />
<reliableSession ordered="true" inactivityTimeout="00:10:00"
enabled="false" />
<security mode="Transport">
<transport clientCredentialType="Windows" protectionLevel="EncryptAndSign" />
<message clientCredentialType="Windows" />
</security>
</binding>
</netTcpBinding>
</bindings>
クライアントエンドポイント:
<client>
<endpoint address="net.tcp://devexstream-2:8080/Service" binding="netTcpBinding"
bindingConfiguration="NetTcpBinding_IService1" contract="TCPService.IService1"
name="NetTcpBinding_IService1">
<identity>
<servicePrincipalName value="TCPService\Devexstream-2" />
<dns value="Devexstream-2.anchorgeneral.local" />
</identity>
</endpoint>
次のようにサービスを編集しましたが、サービスが開始されません。新しいapp.config:
<system.serviceModel>
<bindings>
<netTcpBinding>
<binding name="ExStreamWCFBinding" closeTimeout="00:00:05" openTimeout="00:00:05" receiveTimeout="00:00:05" sendTimeout="00:00:05" transferMode="Buffered" transactionProtocol="OleTransactions" hostNameComparison="StrongWildCard" maxBufferPoolSize="524288" maxBufferSize="524288" maxConnections="10" maxReceivedMessageSize="5242880">
<readerQuotas maxDepth="32" maxStringContentLength="5242880" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
</binding>
</netTcpBinding>
</bindings>
<services>
<service behaviorConfiguration="ExStreamWCF.Service1Behavior"
name="ExStreamWCF.Service1">
<endpoint address="" binding="netTcpBinding" bindingConfiguration="ExStreamWCFBinding"
contract="ExStreamWCF.IService1">
<identity>
<dns value="Devexstream-2.anchorgeneral.local" />
<!--<dns value="vmwin2k3sta-tn2" />-->
</identity>
</endpoint>
<endpoint address="mex" binding="mexTcpBinding" bindingConfiguration=""
contract="IMetadataExchange" />
<Host>
<baseAddresses>
<add baseAddress="net.tcp://Devexstream-2:8080/Service" />
<!--<add baseAddress="net.tcp://vmwin2k3sta-tn2:8080/Service" />-->
</baseAddresses>
</Host>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="ExStreamWCF.Service1Behavior">
<serviceMetadata httpGetEnabled="false" />
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
</serviceBehaviors>
</behaviors>
BindingConfigurationには、netTcpinding要素に割り当てる名前を付ける必要があります。「LargeBuffer」または「LongFields」は、その名前の構成ファイルにbinding要素がない限り、何も意味しません。そのため、サービスを開始してもサービスが開始されません。おそらく、なんらかの構成エラーメッセージが表示されます。
MaxStringContentLengthのデフォルトの8192設定を上書きするには、次のようにします。
エンドポイントのバインディング構成を指定しない場合、サービスはデフォルト値を使用します。
たとえば、上記の設定ファイルを見てください。タグの下に、次のバインディング構成を追加します(使用する特定の値とオプションの属性は、サービスのニーズによって異なることに注意してください)。
<bindings>
<netTcpBinding>
<binding name="ExStreamWCFBinding" closeTimeout="00:00:05" openTimeout="00:00:05" receiveTimeout="00:00:05" sendTimeout="00:00:05" transferMode="Buffered" transactionProtocol="OleTransactions" hostNameComparison="StrongWildCard" maxBufferPoolSize="524288" maxBufferSize="524288" maxConnections="10" maxReceivedMessageSize="5242880">
<readerQuotas maxDepth="32" maxStringContentLength="5242880" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
</binding>
</netTcpBinding>
</bindings>
次に、エンドポイントを定義するとき:
<endpoint address="" binding="netTcpBinding" bindingConfiguration="ExStreamWCFBinding" contract="ExStreamWCF.IService1">
編集用に追加
サービスのエンドポイントでbindingConfiguration属性に値 "NetTcpBinding_IService1"を割り当てて、追加情報に基づいてください。
「maxStringContentLength」値を最大値に変更しても役に立たない場合があります。サーバー構成ファイルの「basicHttpBinding」セクション内に、以下の「デフォルト」バインディングを追加してください。
<binding >
<readerQuotas maxDepth="32" maxStringContentLength="102400" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
</binding>