(MaxArrayLengthは無視されます)WCFのChannelFactoryは、XML設定にバインド設定を使用することを確実にするために(MaxArrayLengthは無視されます)どのようにWCFのChannelFactoryは、XML設定にバインド設定を使用していることを保証するために、どのように
こんにちは、私は、WCFに新しいです私の最初のWcfサービスとクライアントを書くこと。私は設定を生成するために ツールを使用しないことを好む。私はむしろ自分で設定を書くだろう。私が解決しようとしている問題 は、netTcp経由でサービスと通信するクライアントのものです。サービスは、 は非常に大きなペイロードを返す可能性があります(デフォルトの readerQuotas.maxArrayLengthよりも優れています)。 バイトストリームのペイロードが比較的少ない(つまり、16Kと思われるデフォルトよりも少ない)場合、私が最初に開発したコンポーネントはうまく動作します。 私はバインディングを作成し、MaxArrayLength を十分大きな値に設定することで、この問題をプログラム的に解決できます。ただし、 xml設定で同等の処理を実行できる必要があります。
私はapp.config(クライアント)は次のように
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<client>
<endpoint address="net.tcp://localhost:9000/WcfDataService/RemoteDataRequesterService/"
binding="netTcpBinding" bindingConfiguration="unsecureNetTcpBinding"
contract="WcfDataServiceLib.IRemoteDataRequester"
name="DataRequesterEndpoint" />
</client>
<bindings>
<netTcpBinding>
<binding name="unsecureNetTcpBinding" maxReceivedMessageSize="2147483647">
<readerQuotas maxArrayLength="1000000" />
<security mode="None" />
</binding>
</netTcpBinding>
</bindings>
</system.serviceModel>
</configuration>
クライアントプロキシを作成するためのコードは次のとおりです。コードは変数で設定にリンクされていることを
private void Init()
{
var address = new EndpointAddress(@"net.tcp://localhost:9000/WcfDataService/RemoteDataRequesterService/");
const string endpointName = "DataRequesterEndpoint";
ChannelFactory<IRemoteDataRequester> factory = new ChannelFactory<IRemoteDataRequester>(
endpointName);
IRemoteDataRequester proxy = factory.CreateChannel(address);
// call business methods on proxy ...
}
は注意'endpointName'
サービス側の設定(私はこれが関連していると思いますが、万全を期すために含まれません):
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<services>
<service name="WcfDataServiceLib.RemoteDataRequesterService" behaviorConfiguration="WcfDataServiceLib.RemoteDataRequesterServiceBehavior">
<host>
<baseAddresses>
<add baseAddress = "net.tcp://localhost:9000/WcfDataService/RemoteDataRequesterService" />
<add baseAddress="http://localhost:8731/Design_Time_Addresses/WcfDataService/RemoteDataRequesterService/"/>
</baseAddresses>
</host>
<endpoint address ="" binding="netTcpBinding" bindingConfiguration="netTcpBindingConfig" contract="WcfDataServiceLib.IRemoteDataRequester">
<identity>
<dns value="localhost"/>
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="WcfDataServiceLib.RemoteDataRequesterServiceBehavior">
<serviceMetadata httpGetEnabled="False"/>
<serviceDebug includeExceptionDetailInFaults="True" />
</behavior>
</serviceBehaviors>
</behaviors>
<bindings>
<netTcpBinding>
<binding name="netTcpBindingConfig" receiveTimeout="00:00:30">
<readerQuotas maxArrayLength="1000000"/>
</binding>
<binding name="netTcpReliableSession" receiveTimeout="00:00:30" >
<reliableSession enabled="true"/>
</binding>
</netTcpBinding>
</bindings>
</system.serviceModel>
</configuration>
私は大規模なバイトストリームがサービスによって返されたシナリオでは、クライアントを実行し、 例外がスローされ、例外内のメッセージは次のようになります。
通信エラーが発生しました:ソケット接続がアボートされました。これは、メッセージの処理中にエラーが発生したか、またはリモートホストが受信タイムアウトを超過したために、 またはネットワークリソースの問題が原因で発生している可能性があります。 (エラーがすぐに発生し、これはタイムアウトではありません。)59.9687494'
次のように
先に述べたようにが、私はプログラム的にこの問題を解決することができます:00:ローカルソケットタイムアウトは'00だった
var binding = new NetTcpBinding
{
ReaderQuotas = { MaxArrayLength = 10000000 }
};
return new ChannelFactory<IRemoteDataRequester>(binding);
これは問題なく動作しますが、テスト目的でconfigを介して行う必要があります。
私はまた、次のことを試してみました:
var binding = new NetTcpBinding("unsecureNetTcpBinding");
return new ChannelFactory<IRemoteDataRequester>(binding);
しかし、これは違いはありません。
MaxArrayLengthが適切な値に設定されたバインディングを含むエンドポイント設定からチャネルを作成すると、この値は無視されます。
私は解決策を見つけました。構成は一貫して機能していました。しかし、私が提供した設定( "unsecureNetTcpBinding")は、httpサービス(私が設計しているものではないnet tcpサービスではない)を示すコードサンプルから見つけました。設定の不正な部分は でした 'security mode = "None"' 私はこれを取り出したとき、それは働いた。私がreaderQuotas maxArrayLengthを変更した場合、これは必要に応じて適用されます。私のコードが働く理由は、セキュリティモードをnoneに設定していなかったからです。あなたのご意見とご協力ありがとうございます。
私はmaxBufferSize、maxBufferPoolSizeとmaxReceivedMessageSizeを設定しようとしましたが、これらは設定でも動作しません。繰り返しますが、maxArrayLengthのコードでこの問題を解決できますが、config、cheersでそれを行う方法を知りたい – Zephilim
configのmaxBufferSizeとMaxArrayLengthを設定していますが、問題ありません。あなたの事件で何か他のことが起きているに違いない..... –