1

何度も同じような質問をして申し訳ありません。WPF クライアント アプリケーションで WCF サービスを実行していて、WCF サービスを介してクライアント アプリケーションからデータベースに大量のデータを転送したいのですが、この設定について特別なことは何もありません。もちろん、データ (16kb 以上) をバイト配列としてアップロードしようとすると、通常の「最大配列長クォータを超えました」というメッセージが表示され、サーバー側とアプリで web.config を構成する必要が生じました。クライアント側の .config を使用して、すべてに対してより高いリーダー クォータを含めます。

さて、これはstackoverflowで静かに扱われることが多かったので、多くの調査を行い、最終的にサービスバインディングを追跡した結果にたどり着きました

Trace.WriteLine(OperationContext.Current.EndpointDispatcher.ChannelDispatcher.BindingName)

これによりhttp://tempuri.org/:BasicHttpBinding (他の名前空間が構成されていますが) が得られ、カスタム バインディングが適用されるかどうかという疑問が生じます。私のweb.config(サービス側)のコードの一部を見てください。

<system.serviceModel>


<behaviors>

  <serviceBehaviors>
    <behavior>
      <serviceMetadata httpGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="true" />
      <dataContractSerializer maxItemsInObjectGraph="2147483646" />
    </behavior>
  </serviceBehaviors>
</behaviors>

<bindings>
  <basicHttpBinding>
    <binding name="BasicHttpBinding_IDataController" closeTimeout="00:05:00"
      openTimeout="00:05:00" receiveTimeout="00:05:00" sendTimeout="00:05:00"
      maxBufferPoolSize="500000000" maxBufferSize="500000000" maxReceivedMessageSize="500000000" messageEncoding="Mtom">
      <readerQuotas maxDepth="500000000" maxStringContentLength="500000000"
        maxArrayLength="500000000" maxBytesPerRead="500000000" maxNameTableCharCount="500000000" />
    </binding>

    </basicHttpBinding>
</bindings>

<services>
  <service name="DataController">
    <endpoint address="http://vs0092:81/DataController/DataController.svc"  
              binding="basicHttpBinding"
              bindingConfiguration="BasicHttpBinding_IDataController"

              contract="SMS.RC.IDataController" />
    <endpoint contract="IMetadataExchange" binding="mexHttpBinding" address="mex" />

  </service>
</services>

<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />


</system.serviceModel>

クライアント側の app.config は次のようになります

<system.serviceModel>
  <bindings>
    <basicHttpBinding>
      <binding name="BasicHttpBinding_IDataController"
               openTimeout="00:05:00"
               sendTimeout="00:05:00"
               receiveTimeout="00:05:00"
               closeTimeout="00:05:00"
               maxBufferPoolSize="500000000"
               maxReceivedMessageSize="500000000"
               maxBufferSize="500000000">
        <readerQuotas maxDepth="500000000"
                      maxStringContentLength="500000000"
                      maxArrayLength="500000000"
                      maxBytesPerRead="500000000"
                      maxNameTableCharCount="500000000" />

      </binding>
     </basicHttpBinding>
     </bindings>
    <client>
        <endpoint address="http://vs0092:81/DataController/DataController.svc"
            binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IDataController"
            contract="FBCDataController.IDataController" name="BasicHttpBinding_IDataController" />
    </client>
</system.serviceModel>

それで、あなたは問題を見ますか?私はそうではなく、この質問を解決するために本当に多くの努力を払ってきましたが、この時点で、私のWCFは方法が小さすぎると思います。サービスのバインディングが適用されないのはなぜですか?? それは良い ServiceBehavior を実装することの問題でしょうか? サービスの正しい名前を調べる方法はありますか? (私が読んだのは、名前空間を含むフルネームでなければなりません)

どうもありがとう、トム

4

1 に答える 1

0

構成に明らかな問題はありませんが、いくつかの指針があります。

WCF構成ツールを使用して構成を確認/変更することをお勧めします。デフォルトで構成ファイルにある設定だけでなく、使用可能なすべての設定が一覧表示されます。[ツール]メニューにあります。最初にそこから開いてすぐに閉じると、ソリューションエクスプローラーで構成を右クリックして、その特定のファイルに対して実行できることがわかりました。その余分なステップが私に必要な理由がわかりません-あなたのマイレージは異なる場合があります。

WCF構成ツール内から、トレースとログ記録を有効にすることもできます。WCFトレースとログには、通常、例外メッセージ自体よりも、何かが発生したときに何が問題になるかについてのより良い情報があります。

最後に、これほど大きなメッセージの場合は、代わりにストリーミングモデルの使用を検討することをお勧めします。実用的なWCFストリーミングの例を探して、そこから進んでください。

于 2013-01-26T16:32:28.793 に答える