源代码下载 (Web Service 项目需要手动添加)
在介绍过有关WS-Addressing的理论知识后,可能很多人觉得离自己很远,而且没有实际的例子说明它们的作用,觉得实际作用不大。因此在后继的文章中将结合WS-Addressing规范和WSE3.0从实践中说明它们的作用。
如果你曾经Trace过调用Web Service的SOAP消息,你会发现其中根本没有诸如<wsa:To>,<wsa:Action>之类的元素,因此实践中的第一步就是让Message Addressing Properties出现在SOAP消息中。
首先建立一个最简单的Web Service,如下所示:
[WebServiceBinding(
Name = "MathService",
Namespace = "http://idior.cnblogs.com/mathservice/",
ConformsTo = WsiProfiles.BasicProfile1_1,
EmitConformanceClaims = true)]
public interface IMathService
{
[WebMethod()]
double Add(double a, double b);
[WebMethod()]
double Sub(double a, double b);
}
[WebService(Namespace = "http://idior.cnblogs.com/mathservice/")]
public class MathService : IMathService
{
public double Add(double a, double b)
{
return a + b;
}
public double Sub(double a, double b)
{
return a - b;
}
}
然后在客户端添加Web引用,并使用该Web Service:
class Program
{
static void Main()
{
MathService mathService=new MathService();
double result=mathService.Sub(12, 10);
Console.Out.WriteLine(result);
}
}
项目的结构如下所示:
以上过程非常简单,如果正常的话,你将在客户端的Console中看到输出结果。
使用Soap Toolkit 3.0中的Trace Utility来Trace一下调用Web Service过程的SOAP消息:
Request Message:
<?xml version="1.0" encoding="utf-8" ?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<Sub xmlns="http://idior.cnblogs.com/mathservice/">
<a>12</a>
<b>10</b>
</Sub>
</soap:Body>
</soap:Envelope>
Response Message:
<?xml version="1.0" encoding="utf-8" ?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<SubResponse xmlns="http://idior.cnblogs.com/mathservice/">
<SubResult>2</SubResult>
</SubResponse>
</soap:Body>
</soap:Envelope>
其中确实没有出现任何的Message Addressing Properties。OK, 让我们使用WSE来开启这项功能。
如上图所示,在Project Client上点击右键,出现WSE Setting 3.0的选项,点击该选项。
并勾选Enable this project for Web Service Enhancements,然后确认。此时,查看添加Web 引用时生成的Proxy文件---Reference.cs,在其中我们找到MathService这个代理类。
public partial class MathService : System.Web.Services.Protocols.SoapHttpClientProtocol {//...
MathService继承于SoapHttpClientProtocol,为了让Client使用到WSE的功能,需要让MathService继承于另一个基类 --- WebServicesClientProtocol。
public partial class MathService : Microsoft.Web.Services3.WebServicesClientProtocol { //...
如此Client便具有了WSE的增强功能。此时再次Trace一下调用Web Service的SOAP 消息,得到结果如下:
Request Message:
<?xml version="1.0" encoding="utf-8" ?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing"
xmlns:wsse="http://.../oasis-200401-wss-wssecurity-secext-1.0.xsd"
xmlns:wsu="http://.../oasis-200401-wss-wssecurity-utility-1.0.xsd">
<soap:Header>
<wsa:Action>http://idior.cnblogs.com/mathservice/Sub</wsa:Action>
<wsa:MessageID>urn:uuid:201c61e1-d816-4855-9436-e66c53e7ab73</wsa:MessageID>
<wsa:ReplyTo>
<wsa:Address>http://.../addressing/role/anonymous</wsa:Address>
</wsa:ReplyTo>
<wsa:To>http://localhost:1274/MathService/MathService.asmx</wsa:To>
<wsse:Security>
<wsu:Timestamp wsu:Id="Timestamp-e4092262-c294-476d-bf80-a6bb61161356">
<wsu:Created>2006-06-27T03:42:52Z</wsu:Created>
<wsu:Expires>2006-06-27T03:47:52Z</wsu:Expires>
</wsu:Timestamp>
</wsse:Security>
</soap:Header>
<soap:Body>
<Sub xmlns="http://idior.cnblogs.com/mathservice/">
<a>12</a>
<b>10</b>
</Sub>
</soap:Body>
</soap:Envelope>
Response Message:
<?xml version="1.0" encoding="utf-8" ?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<SubResponse xmlns="http://idior.cnblogs.com/mathservice/">
<SubResult>2</SubResult>
</SubResponse>
</soap:Body>
</soap:Envelope>
不出所料,在Client发出的Request Message中我们在SOAP Head中找到了与WS-Adressing相关的Message Addressing Properties,阅读WS-Addressing Message Addressing Properties一文,你会发现这里的内容是与WS-Addressing规范一致的。(其中还包含了一块与ws-Security相关的内容,读者可以暂时不用考虑。)然而Response Message依旧和以前一样,没有与WS-Adressing相关的属性出现,原因很简单,我们只是在Client端开启了WSE,在Service端并没有。
为了让Response Message也使用WS-Adressing,我们需要为MathService项目也开启WSE的功能。与Client项目不同,此时需要将两个选项同时选上。
这样就完成了Service端的配置,再次Trace SOAP消息你会发现Request Message,Response Message中都出现了Message Addressing Properties,并且它们的结果与WS-Addresing规范是一致的:
Request Message:
<?xml version="1.0" encoding="utf-8" ?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing"
xmlns:wsse="http://.../oasis-200401-wss-wssecurity-secext-1.0.xsd"
xmlns:wsu="http://.../oasis-200401-wss-wssecurity-utility-1.0.xsd">
<soap:Header>
<wsa:Action>http://idior.cnblogs.com/mathservice/Sub</wsa:Action>
<wsa:MessageID>urn:uuid:5b8d0882-d2ad-40f1-ad7c-8ecf614b8afc</wsa:MessageID>
<wsa:ReplyTo>
<wsa:Address>http://.../addressing/role/anonymous</wsa:Address>
</wsa:ReplyTo>
<wsa:To>http://localhost:1274/MathService/MathService.asmx</wsa:To>
<wsse:Security>
<wsu:Timestamp wsu:Id="Timestamp-ba231e59-2ac9-44f0-ba86-441dea7aebb6">
<wsu:Created>2006-06-27T04:06:44Z</wsu:Created>
<wsu:Expires>2006-06-27T04:11:44Z</wsu:Expires>
</wsu:Timestamp>
</wsse:Security>
</soap:Header>
<soap:Body>
<Sub xmlns="http://idior.cnblogs.com/mathservice/">
<a>12</a>
<b>10</b>
</Sub>
</soap:Body>
</soap:Envelope>
Response Message:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing"
xmlns:wsse="http://.../oasis-200401-wss-wssecurity-secext-1.0.xsd"
xmlns:wsu="http://.../oasis-200401-wss-wssecurity-utility-1.0.xsd">
<soap:Header>
<wsa:Action>http://idior.cnblogs.com/mathservice/SubResponse</wsa:Action>
<wsa:MessageID>urn:uuid:a4a115f6-bcaa-4245-bb65-27131a0ebadc</wsa:MessageID>
<wsa:RelatesTo>urn:uuid:5b8d0882-d2ad-40f1-ad7c-8ecf614b8afc</wsa:RelatesTo>
<wsa:To>http://.../addressing/role/anonymous</wsa:To>
<wsse:Security>
<wsu:Timestamp wsu:Id="Timestamp-a95201b2-d3d1-40a9-9cc4-8632b10b438e">
<wsu:Created>2006-06-27T04:06:47Z</wsu:Created>
<wsu:Expires>2006-06-27T04:11:47Z</wsu:Expires>
</wsu:Timestamp>
</wsse:Security>
</soap:Header>
<soap:Body>
<SubResponse xmlns="http://idior.cnblogs.com/mathservice/">
<SubResult>2</SubResult>
</SubResponse>
</soap:Body>
</soap:Envelope>