サービス エンドポイントを使用する
最終更新日: 2011年2月15日
適用対象: SharePoint Foundation 2010
この記事の内容
サポートされているプロトコル
サービス エンドポイントを定義する
複数のエンドポイントを提供する
サービス準備コードでエンドポイントを定義する
クライアント構成でエンドポイントを定義する
プロキシ コードでエンドポイントを定義する
Windows Communication Foundation (WCF) サービスとのすべての通信がサービス エンドポイントを介して行われます。サービス エンドポイントでは、エンドポイントを介してアクセスできるサービス クラスのメソッドを定義するコントラクトが指定され、各エンドポイントが一連の異なるメソッドを公開できます。また、エンドポイントでは、クライアントとサービス間の通信方法、およびクライアントと、エンドポイントが存在するネットワーク アドレス間の通信方法を指定するバインディングも定義されます。
サポートされているプロトコル
Service Application Framework は、WCF でサポートされるプロトコルのすべてをサポートしますが、サービス エンドポイントについては http および https プロトコルを使用することを推奨します。
HTTP
HTTPS
注意
Service Application Framework では、HTTPS サービス エンドポイントの Secure Sockets Layer (SSL) 証明書が自動的にインストールおよび構成されます。この証明書は、インターネット インフォメーション サービス (IIS) 管理ユーザー インターフェイスでは表示されませんが、インストールされています。インストールを確認するには、コマンド プロンプトで次のコマンドを入力します。
netsh http show sslcert ipport=0.0.0.0:32844
サービス エンドポイントを定義する
WCF サービス アプリケーションによってサポートされる各エンドポイントを、アプリケーションの web.config 設定で定義する必要があります。各エンドポイントのプロトコルとアドレスは一意でなければなりません。たとえば、2 つのエンドポイントがそれぞれのバインディングで異なるプロトコルを指定する場合、このエンドポイントは同じアドレスを持つことができます。ただし、2 つのエンドポイントが同じプロトコルを使用する場合は、このエンドポイントは、異なるアドレスを指定する必要があります。
エンドポイントのアドレスがバインディング プロトコルに左右されないように、すべてのエンドポイントで一意のエンドポイント アドレスを使用してください。また、Service Application Framework によって構成されたベース アドレスに対する相対アドレスを、エンドポイント アドレスとして指定してください。
たとえば、"http" および "https" の相対アドレスを持つ 2 つのエンドポイントを指定するには、次のコードを使用します。
<services>
<service
name="Microsoft.SharePoint.Test.SampleWebServiceApplication">
<endpoint
address="http"
contract="Microsoft.SharePoint.Test.ISampleWebServiceContract"
binding="customBinding"
bindingConfiguration="SampleWebServiceHttpBinding" />
<endpoint
address="https"
contract="Microsoft.SharePoint.Test.ISampleWebServiceContract"
binding="customBinding"
bindingConfiguration="SampleWebServiceHttpsBinding" />
</service>
</services>
前の例でサービスのベース アドレスが http://machine:8080/application/calculator.svc の場合、エンドポイント アドレスは次のようになります。
http://machine:8080/application/calculator.svc/http
http://machine:8080/application/calculator.svc/https
複数のエンドポイントを提供する
サービス アプリケーションでは、2 つのエンドポイントがサポートされている場合があります。1 つはパフォーマンス上の理由で最適化されたバインディングを使用するエンドポイントです。このエンドポイントでは、たとえば、フロントエンド Web サーバーとアプリケーション サーバー間のネットワーク トラフィックがプライベートのバックエンド LAN にあり、暗号化する必要がありません。もう 1 つはセキュリティ上の理由で最適化されたバインディングを使用するエンドポイントで、このエンドポイントでは、ネットワーク トラフィックを暗号化する必要があります。Service Application Framework に用意されているユーザー インターフェイスを使用すると、ファーム管理者がネットワーク トポロジに最も適したエンドポイントを選択できます。エンドポイントを選択するには、サーバーの全体管理サイトのサービス アプリケーションの管理ページで [発行] オプションを使用するか、Set-SPServiceApplicationWindows PowerShell コマンドレットの DefaultEndpoint パラメーターを使用します。
サービス準備コードでエンドポイントを定義する
既定では、Web サービス アプリケーションには 1 つの HTTP エンドポイントがあります。この構成をサービス アプリケーションで使用する場合、変更の必要はありません。異なるプロトコルを使用する場合、または複数のエンド ポイントをサポートする必要がある場合は、サービス アプリケーションでサポートするすべてのエンドポイントを明示的に定義する必要があります。
次の例のように、SPIisWebServiceApplication の AddServiceEndpoint メソッドを使用します。
// Construct your SPIisWebServiceApplication derived class as usual.
MyWebServiceApplication app = new MyWebServiceApplication(…);
// Commit the new application to the configuration database.
// NOTE: Update must be called before AddServiceEndpoint.
// The service application must be committed to the configuration database before endpoints can be added.
app.Update();
// Add the endpoints supported by the application.
// NOTE: AddServiceEndpoint should be called before app.Provision, because app.Provision will provision
// the default HTTP endpoint if no endpoints are explicitly added to the application.
// NOTE: The default endpoint name is always "http"
app.AddServiceEndpoint("", SPIisWebServiceBindingType.Http);
// Add an alternate HTTPS endpoint.
app.AddServiceEndpoint("secure", SPIisWebServiceBindingType.Https);
"http" と言う名前のエンドポイントが、サービス アプリケーションの既定のエンドポイントとして使用されます。エンドポイント アドレスが一意でない場合でも、サービス エンドポイントの名前は一意である必要があります。同じ相対アドレスに 2 つのエンドポイントがある場合は、AddServiceEndpoint の 3 つ目のオプションのパラメーターを使用して、相対アドレスを指定する必要があります。3 つ目のパラメーターの既定値はエンドポイント名です。
次の例では、同じベース サービス アドレスで 2 つのエンドポイントを定義しており、1 つ目は HTTP プロトコルを、2 つ目は HTTPS プロトコルを使用しています。https エンドポイントは、ベース サービス アドレス "" です。
app.AddServiceEndpoint("", SPIisWebServiceBindingType.Http);
// The default endpoint.
app.AddServiceEndpoint("https", SPIisWebServiceBindingType.Https, "");
クライアント構成でエンドポイントを定義する
また、クライアント構成で各エンドポイントを定義する必要もあります。サービス アプリケーションの web.config ファイルと一致するバインディングを持つ client.config ファイルを作成します。次の例で示すように、各クライアント エンドポイントに一意の name 属性値が必要です。これにより、構成ファイルを読み取るプロキシ コードから参照できるようになります。
この例のエンドポイント構成の名前は、サービス エンドポイントの相対アドレスと一致するように選択されましたが、これは必須ではありません。
<configuration>
<system.serviceModel>
<client>
<endpoint
name="http"
contract="Microsoft.SharePoint.Test.ISampleWebServiceContract"
binding="customBinding"
bindingConfiguration="SampleWebServiceHttpBinding" />
<endpoint
name="https"
contract="Microsoft.SharePoint.Test.ISampleWebServiceContract"
binding="customBinding"
bindingConfiguration="SampleWebServiceHttpsBinding" />
</client>
プロキシ コードでエンドポイントを定義する
プロキシ コードでは、適切なエンドポイント構成を使用してチャネル ファクトリを作成する必要があります。エンドポイント構成は、名前 (endpoint クライアント構成要素の name 属性) によって識別されます。エンドポイント構成の名前を確認するには、チャネルを作成する前にエンドポイント URI を調べ、相対アドレスと既知のエンドポイント アドレスを比較します。次の例では、クライアント チャネル ファクトリのキャッシュで使用するコードを示します。エンドポイント アドレスがプロトコルによってのみ区別されている場合、比較では URI スキームを使用します。
private string m_EndpointConfigurationName;
private ChannelFactory<ISampleWebServiceContract> m_ChannelFactory;
private object m_ChannelFactoryLock = new object();
ここで、指定されたエンドポイント アドレスのエンドポイント構成名を取得します。<param name="address">The endpoint address.</param>
GetEndpointConfigurationName によって、エンドポイント構成の名前が返されます。返されたエンドポイント構成名は、client.config ファイルのエンドポイント要素名の 1 つと一致する必要があります。
private string GetEndpointConfigurationName(Uri address)
{
if (null == address)
{
throw new ArgumentNullException("address");
}
if (address.Scheme == Uri.UriSchemeHttp)
{
return "http";
}
if (address.Scheme == Uri.UriSchemeHttps)
{
return "https";
}
return String.Empty;
}
private ISampleWebServiceContract GetChannel(Uri address)
{
// Create an endpoint address for the service.
EndpointAddress endpointAddress = new EndpointAddress(address);
// Get the endpoint configuration name.
string endpointConfigurationName = GetEndpointConfigurationName(address);
// Check for a cached channel factory for the endpoint configuration.
if ((null == m_ChannelFactory) ||
(endpointConfigurationName != m_EndpointConfigurationName))
{
lock (m_ChannelFactoryLock)
{
if ((null == m_ChannelFactory) ||
(endpointConfigurationName != m_EndpointConfigurationName))
{
// Create a channel factory
// endpoint configuration name.
m_ChannelFactory =
CreateChannelFactory<ISampleWebServiceContract>
(endpointConfigurationName);
// Store the current endpoint configuration name.
m_EndpointConfigurationName = endpointConfigurationName;
}
}
}
// Create a channel from the channel factory.
return m_ChannelFactory.CreateChannel(endpointAddress);
}
注意
チャネル ファクトリがキャッシュされている場合は、キャッシュを無効にする必要があります。