Prenotazione di uno spazio dei nomi HTTP

Questa caratteristica verrà rimossa a partire da una delle prossime versioni di Microsoft SQL Server. Evitare di utilizzare questa funzionalità in un nuovo progetto di sviluppo e prevedere interventi di modifica nelle applicazioni in cui è attualmente implementata.

Per riservare uno spazio dei nomi HTTP da utilizzare con un'istanza di SQL Server, è possibile scegliere tra una prenotazione implicita, ad esempio tramite CREATE ENDPOINT, e una prenotazione esplicita tramite la stored procedure sp_reserve_http_namespace.

Gli spazi dei nomi URL vengono riservati per i motivi seguenti:

  • Un'applicazione in esecuzione con un account non amministrativo, non può eseguire l'associazione allo spazio dei nomi in fase di esecuzione a meno che l'amministratore non riservi lo spazio dei nomi. Si tratta di un requisito del driver HTTP in modalità kernel (Http.sys).

    L'unica eccezione a questa regola è rappresentata dalla situazione in cui l'applicazione viene eseguita nell'ambito dell'account di sistema locale. In tal caso, infatti, le applicazioni possono eseguire l'associazione a qualsiasi spazio dei nomi purché libero. È tuttavia consigliabile prenotare gli spazi dei nomi persino quando si esegue l'applicazione nell'ambito dell'account di sistema locale per il motivo indicato di seguito.

  • La prenotazione garantisce che una sola applicazione possa eseguire l'associazione a uno spazio dei nomi e disponga pertanto della proprietà esclusiva di quello spazio.

    Se, ad esempio, un'istanza di SQL Server viene eseguita nell'ambito dell'account di sistema locale, la prenotazione degli spazi dei nomi non è obbligatoria, ma comunque consigliata per evitare conflitti tra applicazioni relativamente agli URL.

La prenotazione degli spazi dei nomi è gerarchica. Ad esempio, se si riserva lo spazio dei nomi http://adventure-works.com:80/, risulteranno riservati anche tutti i sottospazi dei nomi, quali http://adventure-works.com:80/sqlapp1 e http://adventure-works.com:80/sqlapp2/dir1.

[!NOTA]

Per riservare uno spazio dei nomi HTTP tramite il driver HTTP in modalità kernel (Http.sys), è necessario disporre dei privilegi amministrativi di Windows per il computer locale nel quale è installata l'istanza di SQL Server.

Creazione di una prenotazione esplicita

Per creare una prenotazione esplicita e consentire agli utenti di eseguire un'istruzione DDL (Data Definition Language) di endpoint senza richiedere privilegi di livello elevato per il computer, un amministratore può riservare uno spazio dei nomi URL utilizzando la stored procedure sp_reserve_http_namespace.

Ad esempio, è possibile connettersi a un'istanza di SQL Server utilizzando l'autenticazione di Windows e un account di accesso con privilegi di amministratore ed effettuare quanto segue:

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

La stored procedure consente di riservare in modo esplicito lo spazio dei nomi specificato, in cui MyServer è il nome del server e 80 è il numero di porta. La procedura riserva lo spazio dei nomi URL specificato in modo che per le successive operazioni DDL eseguite all'interno dello spazio dei nomi non sia necessario disporre di privilegi amministrativi. Un utente può pertanto eseguire l'istruzione DDL di endpoint anche senza disporre dei privilegi di amministratore per il computer.

Ad esempio, un utente può eseguire l'istruzione CREATE ENDPOINT seguente:

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

L'istruzione di endpoint si limita a registrare /sql/AdvWorks nello spazio dei nomi riservato in HTTP.SYS. Un'applicazione client può quindi inviare una richiesta SOAP all'endpoint, ad esempio richiedendo una risposta WSDL dal server:

http://MyServer/sql/AdvWorks?wsdl

Il formato del nome dello spazio dei nomi specificato nella stored procedure sp_reserve_http_namespace deve essere simile al seguente:

<scheme>://<hostpart>[:<port>]/<RelativeURI>
  • scheme
    Può essere http o https.

  • hostpart
    Può essere un nome host specifico oppure un carattere jolly a scelta tra il segno più (+) e l'asterisco (*).

    Il segno più (+) implica la validità dell'operazione di prenotazione per tutti i possibili nomi host per il computer relativamente ai valori <scheme> e <port> specificati.

    L'asterisco (*) implica la validità dell'operazione di prenotazione per tutti i nomi host possibili per il computer relativamente ai valori <scheme> e <port> non riservati esplicitamente in altro modo, ad esempio eseguendo altre operazioni sp_reserve_http_namespace, endpoint attivi o altre applicazioni.

Identificazione dello spazio dei nomi per un endpoint

È possibile identificare lo spazio dei nomi corretto per un endpoint in base ai parametri dell'istruzione CREATE ENDPOINT.

Il valore del parametro PORTS per l'istruzione CREATE ENDPOINT determina lo schema per lo spazio dei nomi, come illustrato nella tabella seguente:

Valore dell'endpoint

<scheme> value

CLEAR

http

SSL

https

n

http

Il valore del parametro CLEAR_PORT o SSL_PORT imposta il valore <port> dello spazio dei nomi.

Il valore del parametro PATH imposta il valore <RelativeURI> dello spazio dei nomi.

Il valore del parametro SITE imposta il valore <hostpart> dello spazio dei nomi.

Ad esempio, l'istruzione seguente crea un endpoint che include lo spazio dei nomi http://testhost:80/sqlurl/myapp.

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

L'istruzione seguente crea un endpoint che include lo spazio dei nomi https://*:443/sqlurl/myapp.

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

Esempi

Di seguito è riportato un altro esempio in cui l'amministratore riserva uno spazio dei nomi in HTTP.SYS per la connessione SSL. Pertanto, un utente può creare endpoint in cui PORT è impostato su SSL.

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