所以我注意到如果我“生成消息合同”,那么我的SOAP信封在标题中有操作:
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header>
<Action s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">GetCapabilities</Action>
</s:Header>
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"></s:Body>
</s:Envelope>
代码更清晰,更有意义(但不适用于供应商远程基于Java的Web服务):
Client client = new Client();
GetCapabilitiesResponse response = client.GetCapabilities(new GetCapabilitiesRequest());
litCapabilities.Text = response.Capabilities.version;
client.Close();
另一方面,如果我把它留下来,那么SOAP Envelope在主体中的操作应该是正确的(适用于供应商):
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header></s:Header>
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<GetCapabilities xmlns="http://www.opengis.net/cat/csw/2.0.2"></GetCapabilities>
</s:Body>
</s:Envelope>
但是代码并没有多大意义:
Client client = new Client();
CapabilitiesType response = client.GetCapabilities(new GetCapabilitiesType1());
litCapabilities.Text = response.version;
client.Close();
有人可以给我一个很好的解释,这里发生了什么?这是为什么?
答案 0 :(得分:2)
“生成消息协定”选项允许代理生成器根据服务定义创建消息协定。当您想要访问消息的SOAP结构时,它非常有用。
不同之处在于消息契约意味着客户端事先知道消息定义,因此必须知道mustUnderstand属性。