6

神よ、あなたはただ WCF を愛しているのではありませんか。

考えられるすべてのスレッドを読みましたが、今は本当に行き詰まっています。

WCF 構成は次のとおりです。

<system.serviceModel>
   <bindings>
      <basicHttpBinding>
         <binding name="BaseHttp" 
                  maxBufferSize="4194304" 
                  maxBufferPoolSize="4194304" 
                  maxReceivedMessageSize="4194304"  />
      </basicHttpBinding>
   </bindings>
   <behaviors>
      <serviceBehaviors>
         <behavior name="TaskServiceBehavior">
            <serviceMetadata httpGetEnabled="True" />
            <serviceDebug includeExceptionDetailInFaults="True" />
         </behavior>
         <behavior name="">
            <serviceMetadata httpGetEnabled="true" />
         </behavior>
      </serviceBehaviors>
   </behaviors>
   <services>
      <service behaviorConfiguration="TaskServiceBehavior" name="TaskService">
         <endpoint 
             address="http://www.mysite.com/TableTaskService/TableTaskService.svc" 
             binding="basicHttpBinding" bindingConfiguration="BaseHttp" 
             contract="TableTaskService.ITableTaskService" />
         <endpoint 
             address="mex" 
             binding="mexHttpBinding"  
             contract="IMetadataExchange" />
         <host>
            <baseAddresses>
               <add baseAddress="http://www.mysite.com/TableTaskService/" />
            </baseAddresses>
         </host>
      </service>
   </services>
   <serviceHostingEnvironment>
      <baseAddressPrefixFilters>
         <add prefix="http://www.mysite.com/" />
      </baseAddressPrefixFilters>
   </serviceHostingEnvironment>
</system.serviceModel>

ここで、メッセージを送信すると、このデフォルトの例外がスローされます (svclog ファイルに表示されます)。

受信メッセージの最大メッセージ サイズ クォータ (65536) を超えました。クォータを増やすには、適切なバインド要素で MaxReceivedMessageSize プロパティを使用します。

今、私はそれが4MBであるべきだとはっきりと述べています。

私のクライアントコード:

TableTaskServiceClient client = 
    new TableTaskServiceClient(
          new BasicHttpBinding { MaxBufferSize = 4194304, 
                                 MaxReceivedMessageSize = 4194304 }, 
          new EndpointAddress(GetEndpointAddressString())
    );

それでも、この 65536 サイズのエラーが表示されます。それはどこから来ているのですか?? ...

MaxReceivedMessageSizeまた、クライアントがサーバーと同じ値に設定することは本当に重要ですか? クライアントではなくサーバーが長さを決定する責任があるのは論理的だと思います。

この警告もあります(つまり、オーバーライドされる要素に関する情報がない、または何かが欠落しているという意味で、それがどれほど役立つかに注意してください)、おそらくbasichttpbindingがまさにオーバーライドされるものですか?しかし、それはなぜでしょうか?とりあえず:

[TraceRecord] 重大度警告 TraceIdentifier http://msdn.microsoft.com/en-US/library/System.ServiceModel.OverridingDuplicateConfigurationKey.aspx 説明 構成システムは、別の構成スコープで重複キーを検出し、より新しい構成スコープでオーバーライドしています価値。AppDomain /LM/W3SVC/11/ROOT/TableTaskService-33-1296567 ソース System.ServiceModel.Configuration.ServiceBehaviorElementCollection/-851144413 ElementName 動作 OldElementLineNumber 0 NewElementLineNumber 0

UPDTE: サービスとクライアントの両方を再構成しました:

TableTaskServiceClient client = new TableTaskServiceClient(
                        new BasicHttpBinding { 
                            MaxBufferSize = 4194304, 
                            MaxReceivedMessageSize = 4194304,
                            MaxBufferPoolSize=4194304,
                            ReaderQuotas = new XmlDictionaryReaderQuotas
                                               {
                                                   MaxArrayLength = 4194304, 
                                                   MaxBytesPerRead = 4194304, 
                                                   MaxDepth = 4194304, 
                                                   MaxNameTableCharCount = 4194304,
                                                   MaxStringContentLength = 4194304
                                               }
                        }, new EndpointAddress(GetEndpointAddressString()));

まだ同じエラー。

それが興味深い場合は、467000〜の長さのバイト[]配列を送信しています

4

1 に答える 1

1

これを試して:

<basicHttpBinding>
  <binding name="BaseHttp"
           maxBufferSize="4194304"
           maxBufferPoolSize="4194304"
           maxReceivedMessageSize="4194304">
    <readerQuotas maxArrayLength="4194304"
                  maxBytesPerRead="4194304"
                  maxDepth="4194304"
                  maxNameTableCharCount="4194304"
                  maxStringContentLength="4194304"
                  />
  </binding>
</basicHttpBinding>

これらの設定のいくつかは意味がありませんが、単純に大きな値に設定しています。

また、これが機能するようになったら、サイトへのDoS 攻撃を防ぐために値が存在するため、値を減らすことを強くお勧めします。

于 2011-11-13T16:00:47.997 に答える