2009-12-03 17 views
6

(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に設定していなかったからです。あなたのご意見とご協力ありがとうございます。

答えて

1

私の問題は、あなたの数字には6つのゼロしかないが、コードでは7つのゼロがあるということができると思います。多分?

0

多分、MaxArrayLengthは設定するための適切なプロパティではありません。

てみてください「のMaxBufferSize」と「MaxBufferPoolSize」:

<bindings> 
     <netTcpBinding> 
      <binding name="unsecureNetTcpBinding" 
        maxBufferSize="2147483647" 
        maxBufferPoolSize="2147483647" 
        maxReceivedMessageSize="2147483647"> 
       <readerQuotas maxArrayLength="1000000" /> 
       <security mode="None" /> 
      </binding> 
     </netTcpBinding> 
    </bindings> 

しかし、本当の問題は:あなたが大量のデータを持っている場合は、なぜあなたはWCF streamingを利用していません?それはまさにそのために設計されたものです。

http://www.haveyougotwoods.com/archive/2008/04/14/wcf-message-streaming.aspx

のMaxBufferSizeなどのサイズは、目的にかなり小さい値に設定されている - サービス拒否攻撃を避けるために。これらをMaxIntレベルまでクランキングするだけで、サーバーはこれらのDOS攻撃に対して脆弱になります。

UPDATE:
これをやってみてください。 - 新しいコンソールアプリケーション を作成 - System.Runtime.SerializationSystem.ServiceModel への参照を追加 - あなたのクライアント側の設定は が含まれている正確に何が含まれたapp.configを追加 - これらの行を入れてあなたのコンソールアプリケーションのコードの:

class Program 
    { 
     static void Main(string[] args) 
     { 
      NetTcpBinding binding = new NetTcpBinding("unsecureNetTcpBinding"); 
      int maxArrayLength = binding.ReaderQuotas.MaxArrayLength; 
      long maxReceivedMessageSize = binding.MaxReceivedMessageSize; 
     } 
    } 
  • 実行とデバッグ - あなたはどのような値を得るのですか?あなたが入力した内容を正確に取得します:binding.ReaderQuotas.MaxArrayLengthの場合は「1000000」、binding.MaxReceivedMessageSizeの場合は「2147483647」です。

WCFは、config - 120%保証の設定を認識して使用します。あなたのアプリで何か他の怪物が続かなければならない.....

+0

私はmaxBufferSize、maxBufferPoolSizeとmaxReceivedMessageSizeを設定しようとしましたが、これらは設定でも動作しません。繰り返しますが、maxArrayLengthのコードでこの問題を解決できますが、config、cheersでそれを行う方法を知りたい – Zephilim

+0

configのmaxBufferSizeとMaxArrayLengthを設定していますが、問題ありません。あなたの事件で何か他のことが起きているに違いない..... –

関連する問題