在WebLogic Workshop上创建WSDL
1. 在项目树上,右键单击Web服务,选择“Generate WSDL from JWS”(从JWS生成WSDL)。这样就可以为Web服务创建一个WSDL。每创建一个WSDL,项目树都会将其作为Web服务的子项显示出来。
WebLogic Workshop使用一种特殊的命名约定为WSDL文件和CTRL文件(后面将加以讨论)命名。如果Web服务名为Service.jws,那么该服务的WSDL文件将被命名为ServiceContract.wsdl,而CTRL文件将被命名为ServiceControl.ctrl。
在Visual Studio .NET中创建WSDL
1. 从菜单中选择Debug/Start或者按F5,在浏览器中打开Web服务。
2. 右键单击IE中的“Service Description”链接,选择“Save Target AS”。输入文件名,注意该文件名的后缀应为.wsdl。
即使最简单的Web服务,它的WSDL文件也是非常复杂的。幸运的是,我们在使用使用Web服务时不需要知道WSDL的详细情况。
在WebLogic Workshop上调用.NET服务
WegLogic Workshop和Visual .NET都各有一套机制,通过这种机制可以使用WSDL以及调用该WSDL所指向的Web服务。在WebLogic Workshop下,必须创建一个服务控件(Service Control);在Visual .NET中,对应的是Web引用(Web Reference)。本节将讨论如何为WSDL文件创建服务控件,该服务控件可用于下层的Web服务。下一节将讨论Web引用。
从WSDL创建服务控件
1. 在设计视图中,单击下拉菜单中的“Add Control”,并选择“Service Control”。
2. 在第一个文本框中输入控件的变量名,该变量名将用于指向源代码中的控件。
3. 选择组合框中的“Create a service control from a WSDL”选项,并在文本框中输入WSDL的路径。也可以通过“Browse”按钮来查找WSDL的位置。
4. 单击“Create”按钮。
当创建服务控件时,在Web服务中将会增加以下一行代码:
DotNetExampleControl dotNetExample;
如果.NET Web服务正在运行,你应该就可以运行上述Web服务了,并且可以通过callDotNet方法跨平台调用.NET Web服务。CallDotNet方法将返回一个响应消息,该消息包含了.NET的问候消息:
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soap:Body>
<getHelloMessageResponse xmlns="http://tempuri.org/">
<getHelloMessageResult>
Hello from VisualStudio.NET!
</getHelloMessageResult>
</getHelloMessageResponse>
</soap:Body>
</soap:Envelope>
从.NET调用会话Web服务
在WebLogic Workshop上使用会话(conversation)比较简单,而且是透明的。但是,如果要在.NET上调用会话Web服务,就必须做一些额外的工作,确保会话功能的一致性。
当Web服务的一个客户端调用会话方法时,WebLogic Workshop通过会话键(Conversation key)来决定要调用的会话方法是哪一个。会话键是嵌入在送往Web服务的SOAP消息的头部的。对于start方法,头部的格式如下:
<conversationID>convID</conversationID>
<callbackLocation>callback</callbackLocation>
</StartHeader>
创建一个简单的数据集
一开始,我们要创建一个简单的用于描述一个电话本的数据集,并填上一些简单的示范数据。接着从一个Web服务中返回这个数据集,注意数据集是如何串行化到XML中的。
{
// Create a new data set and add a table to it.
DataSet dataSet = new DataSet("MyDataSet");
DataTable table = dataSet.Tables.Add("PhoneBook");
// Create the columns of the table.
DataColumn primaryKeyCol = table.Columns.Add("ID", typeof(int));
table.Columns.Add("Name", typeof(string));
table.Columns.Add("Telephone", typeof(string));
// Set the ID field as the primary key.
table.PrimaryKey = new DataColumn[] { primaryKeyCol };
// Create some bogus data.
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 the data set to the caller.
return dataSet;
}
这个数据集的XML编码分为两部分。一部分是规划,描述了XML编码的结构;另一部分是数据集的实体。本文将略去规划部分,假定规划是已知的,这里仅仅着重考虑数据编码本身。在一些更复杂的应用中,通过规划来做一些其他的事情通常是很有用的。
通过灵活地反复使用以下格式的元素,就可以将创建好的表中的数据编码成非常简单的格式:
<ID></ID>
<Name></Name>
<Telephone></Telephone>
</PhoneBook>