0

質問:

他のエンドポイントの詳細を取得せずに一方のエンドポイントにアクセスする方法はありますか? それは、サービスのすべてのエンドポイントから詳細を取得せずに、構成されたサービスの 1 つのエンドポイントに接続することですか?

同じクラスを使用して、2 つの異なるインターフェースと 2 つの異なるバインディングを持つ 2 つのエンドポイントを構成しました。

Web サービスは、Windows 7 テスト マシンの IIS 7.5 でホストされています。

web.configファイルからの抜粋:

<bindings>
  <basicHttpBinding>
     <binding name="ServerUIBinding" 
              maxReceivedMessageSize="2097152" maxBufferSize="2097152" 
              sendTimeout="00:01:00" receiveTimeout="00:01:00">
     </binding>
     <binding name="ServerLinkBinding" 
              maxReceivedMessageSize="2097152" maxBufferSize="2097152"  
              sendTimeout="00:02:00" receiveTimeout="00:02:00">
     </binding>
  </basicHttpBinding>
</bindings>
<services>
  <service name="APOServiceLibrary.ServerUI"
           behaviorConfiguration="DefaultMetaDataBehaviour">
    <endpoint name="ServerUIEndPoint"
              address="/ServerUI"
              binding="basicHttpBinding"
              bindingConfiguration="ServerUIBinding"
              contract="APOServiceLibrary.IServerUI">
    </endpoint>
    <endpoint name="ServerLinkEndPoint"
              address="/ServerLink"
              binding="basicHttpBinding"
              bindingConfiguration="ServerLinkBinding"
              contract="APOServiceLibrary.IServerLink">
    </endpoint>
    <endpoint address="mexServer"
              binding="mexHttpBinding"
              contract="IMetadataExchange">
    </endpoint>
  </service>
</services>
<behaviors>
  <serviceBehaviors>
    <behavior name="DefaultMetaDataBehaviour">
      <serviceMetadata httpGetEnabled="True"/>
      <serviceDebug includeExceptionDetailInFaults="False"/>
    </behavior>
  </serviceBehaviors>
</behaviors>

ServerUI.svcファイルで次のようにサービスを構成しました。

<%@ ServiceHost Language="C#" Debug="true" Service="APOServiceLibrary.ServerUI" %>

このツールを使用して、ホストされているサイトに接続すると (私が設定した方法では、次の URL を使用して接続できますhttp://localhost/test/serverui.svc) WcfTestClient.exe、2 つのエンドポイントの内訳を正しく確認でき、参照すると wsdl 定義も同様に確認できます。にhttp://localhost/test/ServerUI.svc?wsdl

ここstackoverflowで、エンドポイントのアドレスフィールド(例:address="/ServerLink")はIIS構成のWebサイトに関連しており、これを使用してエンドポイントの1つだけに接続できるはずであることを読んでいますパスのタイプ:

http://localhost/test/ServerUI.svc/ServerLink

ただし、それはツールでは機能しないようWcfTestClient.exeです。つまりhttp://localhost/test/ServerUI.svc/ServerLink、ツールで接続できません。Web ブラウザーでそのサイトを参照することもできません。追加 新しい C# アプリを作成し、そのアドレスを使用して Web サービスに接続しようとしましたが、機能しません。私がこれを試みるたびに、常にこのタイプのエラーが生成されるようです

エラー: メタデータを取得できません メタデータを取得できません http://localhost/test/ServerUI.svc/ServerLinkこれが Windows (R) Communication Foundation サービスにアクセスできる場合は、指定されたアドレスでのメタデータ公開が有効になっていることを確認してください。

それで、私の質問に戻りますが、これを行う方法はありますか? それは、エンド ポイントの 1 つだけに接続し、その定義を取得することですか? MetadataExchange各エンドポイントのデータを個別に生成するために何か別のことをしなければなりませんか? .svcそのように構成できるファイルに何かありますか?

私がそうしたい理由は、他のチームの一部に、より少ないメソッドで「よりクリーンな」インターフェースを提供し、大きなデータセットのタイムアウト (ServerLink の余分な分タイムアウト) の影響を受けにくいようにするためです。

私が検討した解決策は、ラッパー クラスを作成し、それを使用して別の svc ファイルを作成し、完全に別の URL が使用されるようにすることですが、それは不十分な解決策のようです。

4

1 に答える 1

3

これは、WCF テスト クライアントが、サービスによって公開された mex エンドポイントを使用してすべてのエンドポイントを決定し、エンドポイントと通信できるクライアントを自動的に生成するためです。IServerUIサービス コントラクトを公開するエンドポイント (および) は、潜在的なクライアントに自分自身を説明する方法を知らないため、個々のエンドポイント アドレスを指すことはできません。IServerLink適切にフォーマットされた要求を受け入れ、それぞれに対して適切にフォーマットされた応答を発行する方法しか知らないためです。契約。

を使用して Visual Studio でクライアント コードを自動的に生成する場合も、同じ規則が適用されますsvcutil。個々のコントラクト エンドポイントを指すのではなく、mex エンドポイントを使用してサービス参照を生成する必要があります。はsvcutil、サービス内のすべてのエンドポイントのクライアント コードを自動的に生成します。

サービスと通信するように実際のクライアント (WPF など) を構成する場合、その構成では、アプリが通信する必要があるコントラクトごとにクライアント エンドポイントを構成する必要があります。これらaddressのエンドポイントの は、メタデータ エンドポイントではなく、コントラクトのエンドポイントの実際のアドレスになります (例: http://localhost/test/ServerUI.svc/ServerLink)

あなたは自分自身を言いました:

WcfTestClient.exe ツールを使用して、ホストされたサイトに接続すると (私が設定した方法では、次の URL を使用して接続できますhttp://localhost/test/serverui.svc)、2 つのエンドポイントの内訳を正しく確認でき、wsdl 定義も同様に確認できます。ブラウズするとhttp://localhost/test/ServerUI.svc?wsdl

これは、テスト クライアントの適切で予期される動作です。これで、サービスによって公開されたすべてのエンドポイントに呼び出しを発行できます。クライアントを使用してエンドポイントの 1 つに電話をかけると、その要求が期待する特定のアドレスに送信されます。

于 2013-05-31T16:04:32.347 に答える