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

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

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

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

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

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

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

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

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

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

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

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

USE AdventureWorks2008R2;
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 AdventureWorks2008R2;
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 AdventureWorks2008R2;
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='AdventureWorks2008R2.dbo.GetCustomerInfo', 
             schema=STANDARD ),
   WEBMETHOD 'UDFReturningAScalar' 
            (name='AdventureWorks2008R2.dbo.UDFReturningAScalar'),
   BATCHES = ENABLED,
   WSDL = DEFAULT,
   DATABASE = 'AdventureWorks2008R2',
   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.