4

十分な操作量 (~ 40 操作) のサービス契約を結んでいます。クライアント プロジェクト (またはWCF Test Clientから) からサービス参照を追加しようとすると、エラーが発生します。

エラー: net.tcp://localhost:12345/DataProvider/mex からメタデータを取得できません これがアクセス権を持つ Windows (R) Communication Foundation サービスである場合は、指定されたアドレスでのメタデータ公開が有効になっていることを確認してください。メタデータの公開を有効にする方法については、MSDN のドキュメント ( http://go.microsoft.com/fwlink/?LinkId=65455.WS-Metadata Exchange Error URI: net.tcp://localhost:12345/DataProvider/mex ) を参照してください。メタデータに解決できない参照が含まれています: 'net.tcp://localhost:12345/DataProvider/mex'。XML ドキュメントにエラーがあります。「type」属性の値が無効です - 「q2:PersonFilter」は「type」属性の無効な値です。

ここから始まる奇妙な動作:何もせず、サービス操作の1 つだけを削除すると、すべてがうまくいきます。サービス参照の追加は非常にうまく機能します。もちろん、これらの〜40のすべてのメソッドを削除しようとしたわけではありませんが、〜5を試しました。もう 1 つの重要な点PersonFilter- (エラー メッセージに表示されている型)で動作するメソッドを削除しませんでした。

これを修正する方法がわかりません。さらに情報が必要な場合は、お知らせください。

更新 #1

だから、デフォルトのクォータを増やすためにmexカスタムバインディングを設定しようとしました:

  <customBinding>
    <binding name="mexBinding">
      <binaryMessageEncoding>
        <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" 
                      maxArrayLength="2147483647" maxBytesPerRead="2147483647" 
                      maxNameTableCharCount="2147483647" />
      </binaryMessageEncoding>
      <tcpTransport transferMode="Buffered" maxReceivedMessageSize="2147483647" 
                    maxBufferSize="2147483647" />
    </binding>
  </customBinding>

  <service name="MyNamespace.DataService" behaviorConfiguration="myServiceBehavior">
    <host>
      <baseAddresses>
        <add baseAddress="net.tcp://localhost:12345/DataProvider/" />
      </baseAddresses>
    </host>

    <endpoint binding="netTcpBinding" bindingConfiguration="NetTcpBinding"
              contract="MyNamespace.IDataService" />
    <endpoint address="mex" binding="customBinding" bindingConfiguration="mexBinding"
              name="tcp" contract="IMetadataExchange" />
  </service>

しかし、それは役に立ちません - 同じエラーがまだ発生しています。

更新 #2

ServiceModel メタデータ ユーティリティ ツール (Svcutil.exe)を使用して、次の 3 つのソースからメタデータを取得しようとしました。

  1. HTTP ホスト
  2. TCP ホスト
  3. 直接組み立て

ソース 1. と 3. については、すべて問題ありません。メタデータを取得してクライアント コードを生成することはできますが、svcutilTCP ホスト経由で呼び出すと、次のようになります。

Microsoft (R) Service Model Metadata Tool [Microsoft (R) Windows (R) Communication Foundation、バージョン 4.0.30319.1] Copyright (c) Microsoft Corporation. 全著作権所有。

WS-Metadata Exchange を使用して、'net.tcp://localhost:12345/DataProvider/mex' からメタデータをダウンロードしようとしています。この URL は DISCO をサポートしていません。

Microsoft (R) Service Model Metadata Tool [Microsoft (R) Windows (R) Communication Foundation、バージョン 4.0.30319.1] Copyright (c) Microsoft Corporation. 全著作権所有。

エラー: net.tcp://localhost:12345/DataProvider/mex からメタデータを取得できません

これがアクセス権を持つ Windows (R) Communication Foundation サービスである場合は、指定されたアドレスでのメタデータ公開が有効になっていることを確認してください。メタデータの公開を有効にする方法については、MSDN のドキュメント ( http://go.microsoft.com/fwlink/?LinkId=65455 ) を参照してください。

WS-Metadata Exchange エラー URI: net.tcp://localhost:12345/DataProvider/mex

Metadata contains a reference that cannot be resolved: 'net.tcp://12345/DataProvider/Management/mex'.

There is an error in the XML document.

The value for the 'type' attribute is invalid - 'q2:PersonFilter' is an invalid value for the 'type' attribute.

さらにヘルプが必要な場合は、「svcutil /?」と入力してください。

wcf サービスまたはその構成の何が問題なのか、まだわかりません。

4

2 に答える 2

0

さて、ずっと前に解決策を見つけましたが、答えを投稿するのを完全に忘れています。

そこで、VisualStudioの構成ファイルにいくつか変更を加えましたdevenv.exe.configsystem.serviceModel次のようにセクションを追加しました。

<system.serviceModel>
    <client>
        <endpoint binding="netTcpBinding" bindingConfiguration="GenericBinding" contract="IMetadataExchange" name="net.tcp" />
    </client>
    <bindings>
        <netTcpBinding>
            <binding name="GenericBinding"
                     maxBufferPoolSize="2147483647" maxBufferSize="2147483647"
                     maxReceivedMessageSize="2147483647">
                <readerQuotas maxDepth="2147483647"
                              maxStringContentLength="2147483647"
                              maxArrayLength="2147483647"
                              maxBytesPerRead="2147483647"
                              maxNameTableCharCount="2147483647" />
                <security mode="None" />
            </binding>
        </netTcpBinding>
    </bindings>
</system.serviceModel>

これで、すべてが問題なく機能します。

于 2012-10-31T16:34:36.707 に答える
0

一般に、サービスを最初に基本的な http バインディングで動作させ、その後で net tcp に変更する方が簡単です。

mex エンドポイントを定義することに加えて、メタデータ交換を有効にする必要があります。

<behaviors> 
  <serviceBehaviors> 
    <behavior name="myServiceBehavior"> 
        <serviceDebug includeExceptionDetailInFaults="True" /> 
        <serviceMetadata /> 
    </behavior> 
   </serviceBehaviors> 
 </behaviors> 

この <serviceMetadata /> 要素がないと、mex エンドポイントは機能しません。

于 2012-09-12T20:29:25.143 に答える