使用 SQL 适配器的 WCF 通道模型概述
若要调用 Microsoft BizTalk 适配器上的操作以用于SQL Server,代码充当 WCF 客户端,并将出站操作发送到适配器。 在 WCF 通道模型中,代码通过通道发送请求消息来调用适配器上的操作。
若要使用适配器接收基于轮询的数据更改消息,代码充当 WCF 服务,并从适配器接收入站 轮询、 TypedPolling 或 通知 操作。 换句话说,代码通过通道从适配器接收这些操作的请求消息。
本节中的主题概述了将 SQL 适配器与 WCF 通道模型配合使用。
WCF 通道模型概述
客户端和服务通过交换 SOAP 消息进行通信。 WCF 通道模型是此消息交换的低级抽象。 它提供接口和类型,使你能够使用称为通道堆栈的分层协议堆栈发送和接收消息。 堆栈的每一层都由一个通道组成,每个通道都是从 WCF 绑定创建的。 最底层是传输通道。 传输通道在服务和客户端之间实现基础传输机制,并将每条消息呈现给更高层 (,最终使用的应用程序) 为 System.ServiceModel.Message。 WCF Message 类是 SOAP 消息的抽象。 WCF 提供了多个通道接口(称为通道形状),用于为基本 SOAP 消息交换模式(例如请求-答复或单向)建模。 WCF 传输绑定提供更高层可用于发送和接收消息的一个或多个通道形状的实现。 有关 WCF 通道模型的详细信息,请参阅 通道模型概述。
SQL 适配器是一个 WCF 自定义传输绑定,将SQL Server数据库公开为 WCF 服务。
SQL Server适配器支持的通道形状
适配器实现以下 WCF 通道形状:
IRequestChannel (System.ServiceModel.Channels.IRequestChannel) 。 IRequestChannel 接口实现请求-回复消息交换的客户端。 可以使用 IRequestChannel 来执行想要使用响应的操作,例如对表执行 SELECT 查询。
IOutputChannel (System.ServiceModel.Channels.IOutputChannel) 。 此形状实现单向消息交换的客户端。 可以使用 IOutputChannel 调用不需要使用响应的操作,例如调用没有返回参数的过程。
重要
适配器对 SQL Server 客户端的所有基础调用都是同步的。 这包括对 SQL Server 客户端的调用,这些客户端是通过 IOutputChannel 调用的操作的结果。 使用 IOutputChannel 时,适配器会放弃从SQL Server客户端收到的响应。
IInputChannel (System.ServiceModel.Channels.IInputChannel) 。 此形状实现单向消息交换的服务端。 使用 IInputChannel 从适配器接收入站操作(如 轮询 或 通知)的消息。
与任何 WCF 绑定一样,SQL 适配器使用工厂模式向应用程序代码提供通道。 使用 Microsoft.Adapters.SQLBinding 对象创建以下项的实例:
System.ServiceModel.ChannelFactory<IRequestChannel> 提供可用于在适配器上调用请求-响应操作的 IRequestChannel 通道。
System.ServiceModel.ChannelFactory<IOutputChannel> 提供 IOutputChannel 通道,可用于在适配器上调用单向操作。
System.ServiceModel.IChannelListener<IInputChannel> 用于提供 IInputChannel 通道,可用于从适配器接收入站操作(例如 轮询 或 通知)的消息。
在 WCF 通道模型中为 SQL Server 数据库适配器创建消息
在 WCF 中, System.ServiceModel.Channels.Message 类提供 SOAP 消息的内存中表示形式。 通过调用静态 Message.Create 方法创建 Message 实例。
SOAP 消息有两个重要部分,在创建要发送到 SQL 适配器 的消息 实例时,必须指定这两个部分。
消息操作是 SOAP 消息标头的一部分的字符串。 消息操作标识应在数据库上调用的操作。 下面显示了指定用于调用 Employee 表上的 Select 操作的消息操作:
TableOp/Select/dbo/Employee
。消息正文包含操作的参数数据。 消息正文由格式正确的 XML 组成,这些 XML 对应于 SQL 适配器为请求的操作所需的消息架构。 以下消息正文指定了对 Employee 表的 Select 操作, (SELECT * FROM Employee WHERE Employee_ID=10001) 。
<Select xmlns="http://schemas.microsoft.com/Sql/2008/05/TableOp/dbo/Employee"> <Columns>*</Columns> <Query>where Employee_ID=10001</Query> </Select>
有关 SQL 适配器消息架构和操作的消息操作的信息,请参阅用于 SQL Server 的 BizTalk 适配器的消息和消息架构。
此 Create 方法已重载,并提供许多不同的选项来提供消息正文。 以下代码演示如何通过使用 XmlReader 提供消息正文来创建 Message 实例。 在此代码中,从文件读取消息正文。
XmlReader readerIn = XmlReader.Create("SelectInput.xml");
Message messageIn = Message.CreateMessage(MessageVersion.Default,
"TableOp/Select/dbo/Employee",
readerIn);
重要
必须在 Message 实例中提供 消息 操作。 这通常在创建 Message 实例时完成。