Share via


HTTP 名前空間の予約

この機能は、将来のバージョンの Microsoft SQL Server では削除される予定です。新しい開発作業では、この機能の使用を避け、現在この機能を使用しているアプリケーションは修正するようにしてください。

SQL Server インスタンスで使用する HTTP 名前空間は、暗黙的な予約または明示的な予約を使用して予約できます。暗黙的な予約は、CREATE ENDPOINT 使用時などに行われ、明示的な予約には sp_reserve_http_namespace ストアド プロシージャを使用します。

次の理由により、URL 名前空間を予約します。

  • アプリケーションが管理者以外のアカウントで実行されている場合、管理者により名前空間が予約されていないと、実行時に名前空間にバインドできません。これは、カーネル モードの HTTP ドライバ (Http.sys) による要件です。

    ただし、アプリケーションがローカル システム アカウントで実行されている場合だけは、例外となります。ローカル システム アカウントで実行されているアプリケーションでは、利用可能な任意の名前空間にバインドできます。ただし、次の理由により、アプリケーションがローカル システム アカウントで実行されている場合でも、名前空間を予約することをお勧めします。

  • 名前空間を予約すると、他のアプリケーションでは、その名前空間にバインドすることができなくなります。したがって、アプリケーションでは、その名前空間を独占できます。

    たとえば、SQL Server インスタンスがローカル システム アカウントで実行されている場合、名前空間の予約は必須要件ではありませんが、URL に対するアプリケーション間の競合を回避するため、名前空間を予約することをお勧めします。

名前空間の予約は、階層的に行われます。たとえば、名前空間 http://adventure-works.com:80/ を予約した場合、http://adventure-works.com:80/sqlapp1http://adventure-works.com:80/sqlapp2/dir1 など、下位の名前空間もすべて予約されます。

注意

カーネル モードの HTTP ドライバ (Http.sys) を使用して HTTP 名前空間を予約するには、SQL Server インスタンスがインストールされているローカル コンピュータの Windows 管理者権限が必要です。

明示的な予約の作成

明示的な予約を作成する際、コンピュータに対する高度な権限を必要とせずにユーザーがエンドポイント データ定義言語 (DDL) ステートメントを実行できるようにする場合、管理者は sp_reserve_http_namespace ストアド プロシージャを使用して URL 名前空間を予約できます。

たとえば、Windows 認証 (管理者権限のあるログイン) を使用して SQL Server インスタンスに接続し、次のステートメントを実行できます。

sp_reserve_http_namespace N'http://MyServer:80/sql'
GO

このストアド プロシージャでは、指定した名前空間を明示的に予約します。ここで MyServer にはサーバー名を、80 にはポート番号を指定します。このプロシージャで URL 名前空間を予約すると、その名前空間における後続の DDL 操作ではコンピュータに対する管理者特権は必要ありません。したがって、コンピュータの管理者特権を持たないユーザーでも、エンドポイント DDL ステートメントを実行できます。

たとえば、ユーザーは次の CREATE ENDPOINT ステートメントを実行できます。

CREATE ENDPOINT sql_endpoint 
STATE = STARTED
AS HTTP(
   PATH = '/sql/AdvWorks', 
   AUTHENTICATION = (INTEGRATED ), 
   PORTS = ( CLEAR ), 
   SITE = 'MyServer'
)
FOR SOAP (
    ...
)
GO

このエンドポイント ステートメントでは、単に HTTP.SYS の予約された名前空間に /sql/AdvWorks を登録しています。このステートメントを実行すると、クライアント アプリケーションでは、サーバーからの WSDL 応答を要求するなどして、SOAP 要求をエンドポイントに送信できるようになります。

http://MyServer/sql/AdvWorks?wsdl

sp_reserve_http_namespace ストアド プロシージャで指定する名前空間の名前は、次の形式にする必要があります。

<scheme>://<hostpart>[:<port>]/<RelativeURI>
  • scheme
    http または https を指定します。

  • hostpart
    特定のホスト名または、プラス記号 (+) かアスタリスク (*) のいずれかのワイルドカード文字を指定します。

    プラス記号 (+) は <scheme> および <port> に指定されたコンピュータのすべてのホスト名に、予約操作が適用されることを示します。

    アスタリスク (*) は、sp_reserve_http_namespace 操作を実行するなどして明示的に予約されていない <scheme> および <port> に考えられるすべてのコンピュータのホスト名、アクティブなエンドポイント、または他のアプリケーションに、この予約操作が適用されることを示します。

エンドポイントの名前空間の識別

CREATE ENDPOINT ステートメントでは、パラメータに基づいたエンドポイントの正しい名前空間を識別できます。

次の表に示すように、CREATE ENDPOINT ステートメントへの PORTS パラメータの値で、名前空間のスキームを判断します。

エンドポイント値

<scheme> 値

CLEAR

http

SSL

https

n

http

CLEAR_PORT パラメータまたは SSL_PORT パラメータの値は名前空間の <port> 値を設定します。

PATH パラメータの値は名前空間の <RelativeURI> を設定します。

SITE パラメータの値は名前空間の <hostpart> を設定します。

たとえば、次のステートメントでは、名前空間 http://testhost:80/sqlurl/myapp を持つエンドポイントが作成されます。

CREATE ENDPOINT ext_endpoint
    STATE = STARTED
AS HTTP (       
PATH = '/sqlurl/myapp'
, PORTS = CLEAR
, SITE = testhost
, CLEAR_PORT = 80 
)

次のステートメントでは、名前空間 https://*:443/sqlurl/myapp を持つエンドポイントが作成されます。

CREATE ENDPOINT ext_endpoint
    STATE = STARTED
AS HTTP (       
PATH = '/sqlurl/myapp'
, PORTS = SSL
, SITE = '*'
, SSL_PORT = 443 
)

次に、管理者が SSL 接続用に HTTP.SYS の名前空間を予約する別の例を示します。これにより、ユーザーは、PORT が SSL に設定されたエンドポイントを作成できるようになります。

sp_reserve_http_namespace N'https://MyServer:443/sql'