web-dev-qa-db-ja.com

WCFサービスエンドポイントとホストベースアドレス

だから、私はサービスのエンドポイントとホストベースアドレスが何のためにあるのか混乱しています。これまでに説明したすべての例で、必要なバインディングを使用してエンドポイントをセットアップする方法について説明しており、通常はそれらのエンドポイントに移動できます

ただし、次の設定を使用してサービスを設定およびホストすると、ホストのベースアドレスのみが公開されるようです。

    <configuration>
      <system.web>
        <compilation debug="true" />
      </system.web>
      <!-- When deploying the service library project, the content of the config file must be added to the Host's
      app.config file. System.Configuration does not support config files for libraries. -->
      <system.serviceModel>
        <services>
          <service name="HostService.EvalService">
            <endpoint address="http://localhost:8080/basic"
              binding="basicHttpBinding" contract="HostService.IEvalService" />
            <endpoint address="http://localhost:8080/ws"
              binding="wsHttpBinding" contract="HostService.IEvalService" />
            <endpoint address="mex" binding="mexHttpBinding"
              name="mex" contract="IMetadataExchange" />
            <Host>
              <baseAddresses>
                <add baseAddress="http://localhost:8080/EvalsService" />
              </baseAddresses>
            </Host>
          </service>
        </services>
        <behaviors>
          <serviceBehaviors>
            <behavior name="">
              <serviceMetadata httpGetEnabled="true" />
              <serviceDebug includeExceptionDetailInFaults="false" />
            </behavior>
          </serviceBehaviors>
        </behaviors>
      </system.serviceModel>
    </configuration>

誰かがこれを私に説明できますか?

25
Ryan Burnham

エンドポイントアドレスを空のままにすると、エンドポイントはエンドポイントアドレスに対応するベースアドレスを使用するだけです。または、ベースアドレスをサービスの絶対パスとして設定するか、より良いアプローチとしてエンドポイントの相対アドレスを記述できます。

IISでサービスをホストする場合、サービスのベースアドレスは、IIS仮想ディレクトリと.svcファイルによって決まります。

Calc.svcという名前のファイルがあり、「http:// localhost:8080/calcservice」に対応する仮想ディレクトリに配置するとします。このサービスのベースアドレスは「http:// localhost:8080/calcservice/calc.svc」になります。

IISは、サービス展開パスに従って決定されたこのベースアドレスをエンドポイントに強制的に使用させます。 異なるベースアドレスと対応する仮想ディレクトリを指定すると、例外が発生します。

以下の構成を検討してください。

<configuration>
    <system.serviceModel>
        <services>
            <service name="CalculatorService">
              <!-- base address determined by IIS virtual directory -->
              <endpoint binding="basicHttpBinding" contract="ISimpleMath"/>
              <endpoint address="secure" binding="wsHttpBinding" contract="ISimpleMath"/>
              <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
            </service>
        ...

...エンドポイントアドレスを空のままにしたため、最初のエンドポイントのアドレスはベースアドレス( 'http:// localhost:8080/calcservice/calc.svc')と同じになります。 2番目のエンドポイントのアドレスは、「http:// localhost:8080/calcservice/calc.svc/secure」のように、ベースアドレスに「secure」が追加された組み合わせになります。また、「mex」エンドポイントのアドレスは「http:// localhost:8080/calcservice/calc.svc/mex」です。アドレスの相対部分がファイル名の右側に追加されるため、これは一部の人には少し奇妙に思えるかもしれませんが、calc.svcはベースアドレスの一部であるため、このように動作する必要があることを覚えておく必要があります。

あなたはブラウザを介して "../mex"または "../secure" URLに移動できませんが、実際にはアクティブであり、クライアントはこれらのアドレスを使用できます。

クライアントの動作

クライアントは、サービスのベースアドレスを認識しておらず、通信回線側で同様のものをサポートする必要もありません。そのため、クライアント側のオブジェクトモデルまたは構成セクションにはベースアドレスに関連するものは何も見つかりません。クライアントは特定のエンドポイントを選択するだけです。エンドポイントには常に絶対アドレスが設定されており、その絶対アドレスが送信中に使用するアドレスを決定します。

上記の情報は、主にmsdnのアーロン・スキナードの優れた 記事 から抽出されたものです。 WCFアドレス指定の基礎を理解するためにこのドキュメントを読むことを強くお勧めします。

19
Hasan

ベースアドレスを使用する場合、エンドポイントに絶対URIを指定する必要はありません。たとえば、address="basic"エンドポイント構成セクションでは、これはそのエンドポイントのアドレスがhttp://localhost:8080/EvalsService/basic

6
Jack