从.NET调用会话式网络服务
在WebLogic Workshop中采用会话方式非常简单并且透明。但是,如果希望从.NET调用会话网络服务,必须需要额 外的工作以确保会话功能正常运行。
当网络服务客户端调用会话方法时,WebLogic Workshop采用了会话关键字确定这次调用相关的会话。会话关键字 嵌入在向网络服务发送的SOAP消息头中。对开始(start)方法,消息头格式如下:
<StartHeader >
<conversationID > convID < /conversationID >
<callbackLocation > callback < /callbackLocation >
</StartHeader >
会话ID和回调定位均为可选项。如果未提供会话ID,WebLogic Workshop将为您自动生成一个会话ID。回调定 位 (callback location) 用于指定WebLogic Workshop应向何处发送回调消息。
对于后续方法,会话头具有下列格式:
<ContinueHeader >
<conversationID > convID </conversationID >
</ContinueHeader >
对于后续方法,必须指定会话ID,因为需要有一种方式告诉WebLogic Workshop,调用这个后续方法时,希望 加入哪个会话。回调定位不是必须的,它已经在起始方法中指定过。
为一个.NET网络服务增加SOAP头非常简单。会话网络服务的WSDL文件已经指定了起始和后续头的结构。所有.NET 已经知道如何进行格式化。当.NET创建网络引用时,它为每一个在WSDL中指定的SOAP头的引用中置入了一个字段 (域):
// A web reference to a conversational Web service.
private WLWExample wlwExample;
[WebMethod] public void callStartMethod()
{
wlwExample.StartHeaderValue = new WebReference1.StartHeader();
wlwExample.StartHeaderValue.conversationID = 齝onvID?
wlwExample.StartHeaderValue.callbackLocation = 齝allbackLoc?
wlwExample.startMethod();
}
本例程假设已经有一个名为WebReference1 网络引用包含了一个指向名为cWLWExample网络服务的引用,与前面的 例程相似。WLWExample有一个名为startMethod方法开始一个会话。您应该用您实际需要的会话ID和回调定位替换 字符串"convID" 和"callbackLoc" 。
为了能够调用后续的方法,可以使用类似的代码(用ContinueHeaderValue替换StartHeaderValue )。在WebLogic Workshop中使用.NET DataSets
DataSet 是微软的活动数据对象(Active Data object ),用于提供数据的更通用的包装。一个DataSet 将 其数据模型化为一组表,其结构与SQL的表格非常相近,一样具有特定字段集、特定类型和次序。, DataSet对象 提供了丰富的工具装载和操作数据。但是,针对这篇文章的目的 ,我们对这些工具的兴趣远小于对数据集序列化 机制的关注。
创建DataSet样例
开始时,我们将创建一个简单的DataSet,表示电话簿并逐渐增加相应的例子数据。然后,将DataSet 从网络服务 返回。请注意DataSet如何序列化成为XML格式。
[WebMethod] public DataSet getDataSet()
{
// 创建新数据集,并增加相应的表。
DataSet dataSet = new DataSet("MyDataSet");
DataTable table = dataSet.Tables.Add("PhoneBook");
// 创建表列(字段)。
DataColumn primaryKeyCol = table.Columns.Add("ID", typeof(int));
table.Columns.Add("Name", typeof(string));
table.Columns.Add("Telephone", typeof(string));
// 设置ID字段作为主关键字。
table.PrimaryKey = new DataColumn[] { primaryKeyCol };
// 创建假想数据。
table.LoadDataRow(new object[] {1, "Fred", "555.2145"}, true);
table.LoadDataRow(new object[] {2, "Bob", "555.6246"}, true);
table.LoadDataRow(new object[] {3, "Howard", "555.1125"}, true);
table.LoadDataRow(new object[] {4, "Stanley", "555.0932"}, true);
// 将数据返回给调用者。
return dataSet;
}
DataSet的概要非常简单。这里DataSet(数据集)中有一个表,我们称为"PhoneBook." (电话簿),表包含有三列 -一个ID列,作为主关键字,一个Name列和一个Telephone列。我们已向本DataSet中添加了一些样例数据。当调 用方法时,将返回下列XML:
<?xml version="1.0" encoding="utf-8"?>
<DataSet xmlns="http://tempuri.org/">
<xs:schema id="MyDataSet"
xmlns=""
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xs:element name="MyDataSet" msdata:IsDataSet="true">
<xs:complexType>
<xs:choice maxOccurs="unbounded">
<xs:element name="PhoneBook">
<xs:complexType>
<xs:sequence>
<xs:element name="ID" type="xs:int" />
<xs:element name="Name" type="xs:string"
minOccurs="0" />
<xs:element name="Telephone" type="xs:string"
minOccurs="0" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
<xs:unique name="Constraint1" msdata:PrimaryKey="true">
<xs:selector xpath=".//PhoneBook" />
<xs:field xpath="ID" />
</xs:unique>
</xs:element>
</xs:schema>
<diffgr:diffgram
xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"
xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1">
<MyDataSet xmlns="">
<PhoneBook diffgr:id="PhoneBook1" msdata:rowOrder="0">
<ID>1</ID>
<Name>Fred</Name>
<Telephone>555.2145</Telephone>
</PhoneBook>
<PhoneBook diffgr:id="PhoneBook2" msdata:rowOrder="1">
<ID>21</ID>
<Name>Bob</Name>
<Telephone>555.6246</Telephone>
</PhoneBook>
<PhoneBook diffgr:id="PhoneBook3" msdata:rowOrder="2">
<ID>3</ID>
<Name>Howard</Name>
<Telephone>555.1125</Telephone >
</PhoneBook >
<PhoneBook diffgr:id="PhoneBook4" msdata:rowOrder="3" >
<ID>4</ID >
<Name > Stanley</Name >
<Telephone > 555.0932</Telephone >
</PhoneBook >
</MyDataSet >
</diffgr:diffgram >
</DataSet >
DataSet有两部分XML编码。第一部分为概要,描述了XML编码的结构。第二部分DataSet的实际数据体。本文中, 我们将忽略概要部分,假定预先已知,而只集中精力于数据自身的解码。在更复杂的应用中,可能需要利用概要 提供的其它信息。
我们创建的表中数据被编码为更简单的格式,其元素按下列格式不断重复。
<PhoneBook>
<ID></ID>
<Name></Name>
<Telephone></Telephone>
</PhoneBook>
给定我们所知的特定XML形式,我们能够编写一个WebLogic Workshop 网络服务使用这个数据。