2011-07-18 13 views
1

より小さいパラメータでは動作しますが、大きいパラメータでは失敗する(400:Bad Requestの応答)SilverlightからWCFサービスを呼び出すと、より多くのパラメータを受け入れるようにサーバーを構成できますか?長いパラメータリストを受け入れるようにWCFサービスを設定するにはどうすればよいですか?

ロングバージョン: SilverlightからWCFサービスを呼び出そうとしていて、2000 Guidesを含むGuidのリストを渡しています。サービスコールは最大1100まで動作しますが、これを超えるとエラーが発生します。私はFiddlerのレスポンスを見て、レスポンスコード400(Bad Request)を取得しています。私はこれを設定可能なパラメータと考えていますが、設定を変更する必要があるかどうかはわかりません。私は、設定ファイルが設定されていることを100%確信しているわけではありません。プログラムでこれらの設定が使用されているかどうかを確認する方法がわからないからです。しかし、system.webのhttpRuntime要素のmaxRequestLength、maxQuestyStringLength、maxUrlLengthを変更せずに非常に高い値に設定しようとしました。カスタムバインディングのhttpTransport要素のmaxReceivedMessageSize、maxBufferPoolSize、maxBufferSizeを高い値に設定しました。 basicHttpBindingのreaderQuota要素のmaxDepth、maxArrayLength、maxBytesPerRead、maxNameTableCharCount、およびmaxStringContentLengthを設定しました。

それが今では明らかにされていない場合、私はオンラインいくつかの場所からの推薦に基づき、暗闇の中でランダムスタブを取っていますが、何も何の効果もなかったです。誰かがどの属性を決定的に知っていれば、私はもう一度やり直すことができるはずです。私はいくつかの知識のあるアドバイスを大変感謝しています。また、もし私が設定ファイルからどのような設定が使用されているかをプログラム的にチェックする方法についてのアドバイスがあれば、特に私が思うように既に試したことが適用されていることを確認することができれば助かります。あります。

UPDATE: は少し近い状況を見ると、私の問題は Large WCF web service request failing with (400) HTTP Bad Requestに記載されたものと非常に似ています。 解決策に記載されているようにmaxReceivedMessageSizeを設定しても問題は解決しなかったので、同じ問題であるとは思わなかった。しかし、私は自分のweb.configが正しく適用されていないと思うので、私はちょうどフィドラーでメッセージのサイズをチェックし、最後に成功した呼び出し(1100 Guids)によってメッセージサイズは65481になり、最初に失敗した要求はメッセージサイズ65540です。これは、65536のデフォルト制限を超えています。ここで

は私の現在のweb.config serviceModelセクションです:

<system.serviceModel> 
    <bindings> 
     <basicHttpBinding> 
      <binding name="basicHttpBinding" closeTimeout="01:00:00" 
       openTimeout="01:00:00" receiveTimeout="01:00:00" 
       sendTimeout="01:00:00" maxBufferPoolSize="2147483647" 
       maxBufferSize="2147483647" maxReceivedMessageSize="2147483647"> 
        <readerQuotas maxDepth="2147483647" 
         maxStringContentLength="2147483647" 
         maxArrayLength="2147483647" /> 
      </binding> 
     </basicHttpBinding> 
    </bindings> 
    <services> 
     <service behaviorConfiguration="ReportDataServiceBehavior" 
      name="DSTM.Reporting.ReportDataService"> 
      <endpoint address="" binding="basicHttpBinding" 
       contract="DSTM.Reporting.IReportDataService" /> 
      <endpoint address="mex" binding="mexHttpBinding" 
       contract="IMetadataExchange" /> 
     </service> 
    </services> 
    <behaviors> 
     <serviceBehaviors> 
      <behavior name="ReportDataServiceBehavior"> 
       <serviceMetadata httpGetEnabled="true" /> 
       <serviceDebug includeExceptionDetailInFaults="true" /> 
       <dataContractSerializer maxItemsInObjectGraph="2147483647" /> 
      </behavior> 
     </serviceBehaviors> 
    </behaviors> 
</system.serviceModel> 

どのように私は私が期待していというのが私のサービスは、バインディングを使用していることを確認することができますか?

+0

どのような方法でデータを送信していますか?取得する?役職? –

+0

私はfiddlerでチェックし、POST要求として送信されています。 –

答えて

2

エンドポイント宣言には、組み込みのWCFバインディングBasicHttpBindingを使用するように指示するエンドポイント宣言にbinding="basicHttpBinding"があります。ただし、定義した特定のバインディングを参照するためにbindingConfiguration="basicHttpBinding"を追加しない限り、カスタマイズされたバインディングは使用されません。また、basicHttpBinding自体ではなく、バインディング設定を参照していることを明確にするために、<binding>の名前を変更することもできます。

+0

これは本当に問題でした。maxItemsInObjectGraphは正しい属性ですが、そのバインディングを適切に参照していないため、適用されませんでした。 bindingConfiguration = "basicHttpBinding"を追加しました。これを理解したら、web.configを元に戻す必要があります。 –

0

あなたはGETリクエストとしてURLにパラメータを渡すか、POSTリクエストを使用していますか? GET要求のURLの長さにはIISに制限があります。 その場合、代わりにPOSTを受け入れるようにwebmethod動詞を変更することができます。

+0

良い質問です。私はちょうどfiddlerでチェックし、POST要求として送信されています。 –

関連する問題