Образцы приложений, отправляющих запросы к собственным веб-службам с поддержкой XML

В будущей версии Microsoft SQL Server эта возможность будет удалена. Избегайте использования этой возможности в новых разработках и запланируйте изменение существующих приложений, в которых она применяется.

Действующие образцы, приведенные ниже, иллюстрируют отправку SOAP-запросов и обработку результатов. Среди этих образцов — клиент Visual Studio 2005 как для C#, так и для Visual Basic.

Начальная настройка

Все образцы приложений требуют одних и тех же шагов для настройки, а именно:

  1. создание образца хранимой процедуры;

  2. создание определяемой пользователем функции;

  3. создание конечной точки HTTP SOAP.

ПримечаниеПримечание

Для создания этих объектов в образце базы данных AdventureWorks можно воспользоваться как средой SQL Server Management Studio, так и программой командной строки osql. Дополнительные сведения об установке образца базы данных AdventureWorks см. в разделе Вопросы установки образцов кода и образцов баз данных SQL Server.

Создание хранимой процедуры (GetCustomerInfo)

Приведенная ниже хранимая процедура демонстрирует обработку клиентским приложением входных и выходных параметров, кодов возврата, результатов запросов, а также возникших при выполнении ошибок.

USE AdventureWorks
GO
DROP PROCEDURE GetCustomerInfo
GO
CREATE PROCEDURE GetCustomerInfo
                    @CustomerID nchar(5),
                    @OutputParam nchar(5) OUTPUT 
AS  

  SELECT @OutputParam = '99999'  
  -- The following INSERT should fail, and an-error returned 
  -- to the client.
  INSERT Store (CustomerID) VALUES (1)

 -- Execute a SELECT statement.
 SELECT top 3 SalesOrderID, OrderDate 
 FROM   Sales.SalesOrderHeader
 WHERE  CustomerID = @CustomerID

 -- Execute SELECT returning XML.
  SELECT CustomerID, SalesOrderID, OrderDate 
  FROM   Sales.SalesOrderHeader
  WHERE  CustomerID = @CustomerID
  for xml auto, XMLSCHEMA

  PRINT 'Hello World'
RETURN 0
Go

Хранимая процедура имеет два параметра: входной параметр (CustomerID) и выходной параметр (OutParam), которые демонстрируют передачу параметров.

Хранимая процедура выполняет следующие инструкции.

  • Инструкцию INSERT, умышленно написанную таким образом, что ее выполнение завершается ошибкой. Это позволяет продемонстрировать возврат ошибок в ответе SOAP. В Visual Studio 2005 ошибки возвращаются в виде объектов SqlMessage.

  • Инструкцию SELECT. В Visual Studio 2005 результирующий набор строк возвращается в виде объекта DataSet.

  • Запрос SELECT FOR XML, возвращающий XML-данные. В Visual Studio 2005 результирующий набор строк возвращается в виде объекта SqlXml.

  • Инструкцию PRINT. Результат ее выполнения возвращается в Visual Studio 2005 в виде объекта SqlMessage.

Создание определяемой пользователем функции (UDFREturningAScalar)

Эта функция возвращает целочисленное значение.

USE AdventureWorks
GO
CREATE FUNCTION UDFReturningAScalar() 
RETURNS int
AS
BEGIN
   RETURN 555
END
Go

Создание конечной точки HTTP SOAP (sql_endpoint)

Эта конечная точка позволяет обращаться к хранимой процедуре и определяемой пользователем функции как к веб-методам. Конечная точка настраивается таким образом, чтобы поддерживались и нерегламентированные запросы. Клиентское приложение может отправлять к конечной точке SOAP-запросы, содержащие нерегламентированные запросы.

Обратите внимание на то, что для конечной точки необходимо будет указать имя сервера как значение параметра hostname при резервировании для конечной точки пространства имен HTTP (sp_reserve_http_namespace), а также при заполнении параметра SITE. Также следует учесть, что значение параметра port должно совпадать с номером порта HTTP, используемого экземпляром SQL Server (например, оно может быть равным «80» или другому числу, если экземпляр использует другой номер порта).

USE AdventureWorks
GO
DROP ENDPOINT sql_endpoint
GO
EXEC sp_reserve_http_namespace N'http://hostname:port/sql' 
-- EXEC sp_reserve_http_namespace N'https://www.microsoft.com:80/sql' for example
GO
CREATE ENDPOINT sql_endpoint 
   STATE = STARTED
AS HTTP(
   PATH = '/sql', 
   AUTHENTICATION = (INTEGRATED ), 
   PORTS = ( CLEAR ),
   SITE = 'server'
)
FOR SOAP (
   WEBMETHOD 'http://tempUri.org/'.'GetCustomerInfo' 
            (name='AdventureWorks.dbo.GetCustomerInfo', 
             schema=STANDARD ),
   WEBMETHOD 'UDFReturningAScalar' 
            (name='AdventureWorks.dbo.UDFReturningAScalar'),
   BATCHES = ENABLED,
   WSDL = DEFAULT,
   DATABASE = 'AdventureWorks',
   NAMESPACE = 'http://Adventure-Works/Customers'
)
GO
USE master
EXEC sp_grantlogin @loginame='domain\userOrGroup'
EXEC sp_grantdbaccess @loginame='domain\userOrGroup'
GRANT CONNECT ON ENDPOINT::sql_endpoint TO [domain\userOrGroup]
GO

В приведенном выше коде обратите внимание на следующее.

  • При создании этой конечной точки определяются два веб-метода.

  • WSDL установлено в значение DEFAULT. Поэтому клиент может запросить от сервера ответ в формате WSDL.

  • BATCHES установлено в значение ENABLED. Поэтому клиент может отправлять к этой конечной точке нерегламентированные запросы.

  • Веб-метод UDFReturningAScalar не определяет необязательное пространство имен. Он использует пространство имен, определяемое значением NAMESPACE.

  • В качестве значения domain\userOrGroup, сформированного как имя входа SQL Server, должен быть указан существующий пользователь домена или группы, которому требуется доступ к конечной точке HTTP.