架构支持
WsUtil.exe 支持在 XML 架构中指定的 XSD 架构。 xsd 文件和 wsdl:type 应归为一类,但在 wsdl:type 中,全局元素可以是参数列表时例外。 Wsutil.exe 为可在序列化程序中使用的所有全局元素定义生成元素说明,以及 WSDL 支持中指定的参数结构的其他输出。
XSD 架构支持级别
WsUtil.exe 不支持 XSD 架构的完整范围。 当前支持级别在架构支持级别中定义。
标识符生成
架构中的元素名称或类型名称可能不是有效的 C 标识符,并且名称规范化为生成的有效 C 名称。 无效的 C 标识符字符会转换为十六进制名称,如有必要,可在名称前添加下划线“_”。 匿名类型以封闭元素名称命名,但以下划线“_”为前缀,以避免名称冲突。 在对无效字符进行规范化处理后,全局类型名称按原样保留。 嵌套匿名类型以父类型名称为前缀。
对于每个全局元素定义,wsutil.exe 会在全局说明结构中生成 WS_ELEMENT_DESCRIPTION。 对于每个全局类型定义,wsutil.exe 会在要由应用程序引用的全局说明结构中生成类型说明。
对于结构中的每个字段,wsutil.exe 都会生成一个 WS_FIELD_DESCRIPTION,作为封闭结构的一部分嵌入其中。
简单类型
值类型(如 WS_VALUE_TYPE 中列出的)被视为简单类型。 请注意 WS_VALUE_TYPE 实际上是 WS_TYPE 的子集。 它包括基本的整型和浮点数据类型,以及 DECIMAL、WS_DATETIME 和 UUID。
在服务模式中,in 简单类型通过值传递,而 out 和 in,out 简单类型通过引用传递。
Wsutil 为包含简单类型的全局元素创建简单元素说明,如下所示。
<xs:schema xmlns:tns="http://Example.org" elementFormDefault="qualified"
targetNamespace="http://Example.org" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="helloworld" type="xs:int"></xs:element>
</xs:schema>
Wsutil 生成以下元素说明:
... // global elements
{ // helloworld
{
(WS_XML_STRING*)&example_wsdlLocalDefinitions.dictionary.xmlStrings.helloworldTypeName,
(WS_XML_STRING*)&example_wsdlLocalDefinitions.dictionary.xmlStrings.helloworldTypeNamespace,
WS_INT32_TYPE,
0,
},
}, // helloworld
...
此结构作为头文件中生成的全局说明结构的一部分生成:
typedef struct _example_wsdl
{
WS_ELEMENT_DESCRIPTION helloworld;
} _example_wsdl;
数组
如果元素的 maxOccurs 大于 1 或序列仅包含一个项,并且子元素的 maxOccurs 大于 1,则该元素被视为数组。 对于架构中的数组元素,wsutil.exe 生成两个字段:一个是不上线的计数字段,另一个是包含数组类型的指针字段。
<xs:schema xmlns:tns="http://Example.org" elementFormDefault="qualified"
targetNamespace="http://Example.org" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="SimpleArray">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="50" name="a" nillable="true" type="xs:int" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
头文件包含数组的 C 结构定义,字段 aCount 指定数组的计数。
typedef struct SimpleArray
{
unsigned int aCount ;
int * a;
} SimpleArray;
下面是描述数组的 LocalDefinition 原型的一部分:
... // globalElement part of the LocalDefinitions.
struct // SimpleArray
{
struct // SimpleArray
{
WS_FIELD_DESCRIPTION a;
WS_FIELD_DESCRIPTION * SimpleArrayFields [1];
WS_STRUCT_DESCRIPTION structDesc;
} SimpleArraydescs; // SimpleArray
WS_ELEMENT_DESCRIPTION elementDesc;
} SimpleArray;
// Method with array parameters.
typedef HRESULT (CALLBACK *SimpleMethodCallback)(
const WS_OPERATION_CONTEXT* context,
unsigned int aCount,
int* a,
unsigned int *bCount,
int** b,
unsigned int* cCount,
int** c,
const WS_ASYNC_CONTEXT* asyncContext,
WS_ERROR* error);
HRESULT CALLBACK SimpleMethod (
WS_SERVICE_PROXY* serviceProxy,
WS_HEAP* heap,
unsigned int aCount,
int* a,
unsigned int *bCount,
int** b,
unsigned int* cCount,
int** c,
const WS_ASYNC_CONTEXT* asyncContext,
WS_ERROR* error);
下面是上述说明的生成的定义,请注意 WS_REPEATING_ELEMENT_FIELD_MAPPING,它指示字段用作数组字段。
...
{ // SimpleArray
{ // SimpleArray
{ // field description for a
WS_REPEATING_ELEMENT_FIELD_MAPPING,
0,
0,
WS_INT32_TYPE,
0,
WsOffsetOf(SimpleArray, a),
0,
0,
WsOffsetOf(SimpleArray, aCount),
(WS_XML_STRING*)&example_wsdlLocalDefinitions.dictionary.xmlStrings.aLocalName,
(WS_XML_STRING*)&example_wsdlLocalDefinitions.dictionary.xmlStrings.aNamespace,
}, // end of field description for a
{ // fields description for SimpleArray
(WS_FIELD_DESCRIPTION*)&example_wsdlLocalDefinitions.globalElements.SimpleArray.SimpleArraydescs.a,
},
{
sizeof(SimpleArray),
__alignof(SimpleArray),
(WS_FIELD_DESCRIPTION**)example_wsdlLocalDefinitions.globalElements.SimpleArray.SimpleArraydescs.
SimpleArrayFields,
WsCountOf(example_wsdlLocalDefinitions.globalElements.SimpleArray.SimpleArraydescs.SimpleArrayFields),
(WS_XML_STRING*)&example_wsdlLocalDefinitions.dictionary.xmlStrings.SimpleArrayTypeName,
(WS_XML_STRING*)&example_wsdlLocalDefinitions.dictionary.xmlStrings.aNamespace,
}, // struct description for SimpleArray
}, // SimpleArray
{
(WS_XML_STRING*)&example_wsdlLocalDefinitions.dictionary.xmlStrings.SimpleArrayTypeName,
(WS_XML_STRING*)&example_wsdlLocalDefinitions.dictionary.xmlStrings.aNamespace,
WS_STRUCT_TYPE,
(void *)&example_wsdlLocalDefinitions.globalElements.SimpleArray.SimpleArraydescs.structDesc,
},
}, // SimpleArray
...
如果数组是输入/输出消息中的参数字段,则会为该方法生成两个实际参数。 如果数组是 out 或 in,out 参数,则 paramStruct 中的两个字段会有一个额外的间接级别。
数组上的范围
建议最好不要为数组指定 maxOccur="unbounded" 应指定固定整数,以设置允许的数组计数上限。 整型类型以及字符串、字节数组和泛型数组都支持范围。
包装式和非包装式数组的启发
有时,数组会被包装在另一个结构中,嵌入到顶级结构中。 在这种情况下,应删除中间包装器层。 WsUtil.exe 生成与上述 SimpleArray 相同的原型和说明。
<xs:schema xmlns:tns="http://Example.org" elementFormDefault="qualified"
targetNamespace="http://Example.org" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:complexType name="SimpleArray">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="50" name="aa" type="xs:int" />
</xs:sequence>
</xs:complexType>
<xs:element name="SimpleArrayWrapper">
<xs:complexType>
<xs:sequence>
<xs:element name="SimpleArray" type="tns:SimpleArray" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
Wsutil 检测到 SimpleArrayWrapper 是 SimpleArray 的包装器,并且仅生成以下结构,而 SimpleArray 具有单独的结构
typedef struct SimpleArrayWrapper
{
unsigned int SimpleArrayCount ;
int * SimpleArray;
} SimpleArrayWrapper;
.. // global element inside the LocalDefinitions prototype
struct // SimpleArrayWrapper
{
struct // SimpleArrayWrapper
{
WS_FIELD_DESCRIPTION SimpleArray;
WS_FIELD_DESCRIPTION * SimpleArrayWrapperFields [1];
WS_STRUCT_DESCRIPTION structDesc;
} SimpleArrayWrapperdescs; // SimpleArrayWrapper
WS_ELEMENT_DESCRIPTION elementDesc;
} SimpleArrayWrapper;
...
wsutil.exe 为上述匹配原型生成以下定义,请注意,在字段说明中,包装器名称和包装器命名空间字段已填充
... // global element part of the LocalDefinitions structure:
{ // SimpleArrayWrapper
{ // SimpleArrayWrapper
{ // WS_FIELD_DESCRIPTION for SimpleArray
WS_REPEATING_ELEMENT_FIELD_MAPPING,
(WS_XML_STRING*)&example_wsdlLocalDefinitions.dictionary.xmlStrings.SimpleArrayWrapperName,
(WS_XML_STRING*)&example_wsdlLocalDefinitions.dictionary.xmlStrings.SimpleArrayNamespace,
WS_INT32_TYPE,
0,
WsOffsetOf(SimpleArrayWrapper, SimpleArray),
0,
0,
WsOffsetOf(SimpleArrayWrapper, SimpleArrayCount),
(WS_XML_STRING*)&example_wsdlLocalDefinitions.dictionary.xmlStrings.SimpleArrayLocalName,
(WS_XML_STRING*)&example_wsdlLocalDefinitions.dictionary.xmlStrings.SimpleArrayNamespace,
}, // end of field description for SimpleArray
{ // array of field descriptions for SimpleArrayWrapper
(WS_FIELD_DESCRIPTION *)&example_wsdlLocalDefinitions.globalElements.SimpleArrayWrapper.SimpleArrayWrapperdescs.SimpleArray,
},
{ // WS_STRUCT_DESCRIPTION for SimpleArrayWrapper
sizeof(SimpleArrayWrapper),
__alignof(SimpleArrayWrapper),
(WS_FIELD_DESCRIPTION**)example_wsdlLocalDefinitions.globalElements.SimpleArrayWrapper.SimpleArrayWrapperdescs.SimpleArrayWrapperFields,
WsCountOf(example_wsdlLocalDefinitions.globalElements.SimpleArrayWrapper.SimpleArrayWrapperdescs.SimpleArrayWrapperFields),
(WS_XML_STRING*)&example_wsdlLocalDefinitions.dictionary.xmlStrings.SimpleArrayWrapperTypeName,
(WS_XML_STRING*)&example_wsdlLocalDefinitions.dictionary.xmlStrings.SimpleArrayNamespace,
}, // struct description for SimpleArrayWrapper
}, // SimpleArrayWrapper
{ // WS_ELEMENT_DESCRIPTION for SimpleArrayWrapper
(WS_XML_STRING*)&example_wsdlLocalDefinitions.dictionary.xmlStrings.SimpleArrayWrapperTypeName,
(WS_XML_STRING*)&example_wsdlLocalDefinitions.dictionary.xmlStrings.SimpleArrayNamespace,
WS_STRUCT_TYPE,
(void *)&example_wsdlLocalDefinitions.globalElements.SimpleArrayWrapper.SimpleArrayWrapperdescs.structDesc,
},
}, // SimpleArrayWrapper
结构
序列中具有多个元素的 complexType 是一种结构。 例如,
<xs:schema xmlns:tns="http://Example.org" elementFormDefault="qualified"
targetNamespace="http://Example.org" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:complexType name="StructType">
<xs:sequence>
<xs:element minOccurs="0" name="FirstName" nillable="true" type="xs:string" />
<xs:element minOccurs="0" name="LastName" nillable="true" type="xs:string" />
</xs:sequence>
</xs:complexType>
<xs:element name="StructType" nillable="true" type="tns:StructType" />
</xs:schema>
Wsutil.exe 生成结构原型,如下所示:
struct StructType
{
WS_STRING FirstName;
WS_STRING LastName;
};
// methods using structure parameters.
typedef HRESULT (CALLBACK *SimpleMethodCallback) (
const WS_OPERATION_CONTEXT* context,
StructType* a,
StructType** b,
StructType** c,
const WS_ASYNC_CONTEXT* asyncContext,
WS_ERROR* error);
HRESULT CALLBACK SimpleMethod (WS_SERVICE_PROXY* serviceProxy,
WS_HEAP* heap,
StructType* a,
StructType** b,
StructType** c,
const WS_ASYNC_CONTEXT* asyncContext,
WS_ERROR* error);
wsutil 为 LocalDefinition 生成以下原型:
struct // StructType
{
struct // StructType
{
WS_FIELD_DESCRIPTION FirstName;
WS_FIELD_DESCRIPTION LastName;
WS_FIELD_DESCRIPTION * StructTypeFields [2];
WS_STRUCT_DESCRIPTION structDesc;
} StructTypedescs; // StructType
WS_ELEMENT_DESCRIPTION elementDesc;
}
结构的定义如下所示,结构中具有两个字段说明。
// global element inside LocalDefinitions.
{ // StructType
{ // StructType
{ // field description for FirstName
WS_ELEMENT_FIELD_MAPPING,
(WS_XML_STRING*)&example_wsdlLocalDefinitions.dictionary.xmlStrings.FirstNameLocalName,
(WS_XML_STRING*)&example_wsdlLocalDefinitions.dictionary.xmlStrings.FirstNameNamespace,
WS_STRING_TYPE,
0,
WsOffsetOf(StructType, FirstName),
0,
0,
}, // end of field description for FirstName
{ // field description for LastName
WS_ELEMENT_FIELD_MAPPING,
(WS_XML_STRING*)&example_wsdlLocalDefinitions.dictionary.xmlStrings.LastNameLocalName,
(WS_XML_STRING*)&example_wsdlLocalDefinitions.dictionary.xmlStrings.FirstNameNamespace,
WS_STRING_TYPE,
0,
WsOffsetOf(StructType, LastName),
0,
0,
}, // end of field description for LastName
{ // fields description for StructType
(WS_FIELD_DESCRIPTION *)&example_wsdlLocalDefinitions.globalElements.StructType.StructTypedescs.FirstName,
(WS_FIELD_DESCRIPTION *)&example_wsdlLocalDefinitions.globalElements.StructType.StructTypedescs.LastName,
},
{ // WS_STRUCT_DESCRIPTION for StructType
sizeof(StructType),
__alignof(StructType),
(WS_FIELD_DESCRIPTION**)example_wsdlLocalDefinitions.globalElements.StructType.StructTypedescs.StructTypeFields,
WsCountOf(example_wsdlLocalDefinitions.globalElements.StructType.StructTypedescs.StructTypeFields),
(WS_XML_STRING*)&example_wsdlLocalDefinitions.dictionary.xmlStrings.StructTypeTypeName,
(WS_XML_STRING*)&example_wsdlLocalDefinitions.dictionary.xmlStrings.FirstNameNamespace,
}, // struct description for StructType
}, // StructType
{
(WS_XML_STRING*)&example_wsdlLocalDefinitions.dictionary.xmlStrings.StructTypeTypeName,
(WS_XML_STRING*)&example_wsdlLocalDefinitions.dictionary.xmlStrings.FirstNameNamespace,
WS_STRUCT_TYPE,
(void *)&example_wsdlLocalDefinitions.globalElements.StructType.StructTypedescs.structDesc,
},
}, // StructType
为了支持扩展性,始终通过引用传递嵌入式结构。 在服务中,所有 out 或 in,out 结构都通过双指针传递,以允许将来扩展结构,并允许 nillable 结构。
递归结构
支持递归结构,并且嵌入类型通过引用传递。 对于以下 wsdl:
<xs:schema xmlns:tns="http://Example.org" elementFormDefault="qualified"
targetNamespace="http://Example.org" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="SimpleMethod">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="a" type="xs:int" />
<xs:element minOccurs="0" name="b" type="tns:example" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="example">
<xs:sequence>
<xs:element minOccurs="0" name="d" type="tns:example" />
<xs:element minOccurs="0" name="c" type="xs:int" />
</xs:sequence>
</xs:complexType>
</xs:schema>
Wsutil 生成以下类型定义以及类型说明:
typedef struct example
{
struct example * d;
int32 c;
} example;
typedef struct SimpleMethod
{
unsigned __int32 a;
struct example * b;
} SimpleMethod;
// global element part of the LocalDefinitions.
...
struct // SimpleMethod
{
struct // SimpleMethod
{
WS_FIELD_DESCRIPTION a;
struct // example
{
WS_FIELD_DESCRIPTION d;
WS_FIELD_DESCRIPTION c;
WS_FIELD_DESCRIPTION * exampleFields [2];
WS_STRUCT_DESCRIPTION structDesc;
} exampledescs; // example
WS_FIELD_DESCRIPTION b;
WS_FIELD_DESCRIPTION * SimpleMethodFields [2];
WS_STRUCT_DESCRIPTION structDesc;
} SimpleMethoddescs; // SimpleMethod
WS_ELEMENT_DESCRIPTION elementDesc;
} SimpleMethod;
...
定义如下生成:
{ // SimpleMethod
{ // field description for a
WS_ELEMENT_FIELD_MAPPING,
(WS_XML_STRING*)&example_wsdlLocalDefinitions.dictionary.xmlStrings.aLocalName,
(WS_XML_STRING*)&example_wsdlLocalDefinitions.dictionary.xmlStrings.aNamespace,
WS_INT32_TYPE,
0,
WsOffsetOf(SimpleMethod, a),
0,
0,
}, // end of field description for a
{ // example
{ // field description for d
WS_ELEMENT_FIELD_MAPPING,
(WS_XML_STRING*)&example_wsdlLocalDefinitions.dictionary.xmlStrings.dLocalName,
(WS_XML_STRING*)&example_wsdlLocalDefinitions.dictionary.xmlStrings.aNamespace,
WS_STRUCT_TYPE,
(WS_STRUCT_DESCRIPTION*)&example_wsdlLocalDefinitions.globalElements.SimpleMethod.SimpleMethoddescs.structDesc,
WsOffsetOf(example, d),
WS_FIELD_POINTER,
0,
}, // end of field description for d
{ // field description for c
WS_ELEMENT_FIELD_MAPPING,
(WS_XML_STRING*)&example_wsdlLocalDefinitions.dictionary.xmlStrings.cLocalName,
(WS_XML_STRING*)&example_wsdlLocalDefinitions.dictionary.xmlStrings.aNamespace,
WS_INT32_TYPE,
0,
WsOffsetOf(example, c),
0,
0,
}, // end of field description for c
{ // fields description for example
(WS_FIELD_DESCRIPTION *)&example_wsdlLocalDefinitions.globalElements.SimpleMethod.SimpleMethoddescs.exampledescs.d,
(WS_FIELD_DESCRIPTION *)&example_wsdlLocalDefinitions.globalElements.SimpleMethod.SimpleMethoddescs.exampledescs.c,
},
{
sizeof(example),
__alignof(example),
(WS_FIELD_DESCRIPTION**)example_wsdlLocalDefinitions.globalElements.SimpleMethod.SimpleMethoddescs.exampledescs.exampleFields,
WsCountOf(example_wsdlLocalDefinitions.globalElements.SimpleMethod.SimpleMethoddescs.exampledescs.exampleFields),
(WS_XML_STRING*)&example_wsdlLocalDefinitions.dictionary.xmlStrings.exampleTypeName,
(WS_XML_STRING*)&example_wsdlLocalDefinitions.dictionary.xmlStrings.aNamespace,
}, // struct description for example
}
结构继承
wsutil 支持复杂类型扩展,其中一个复杂类型是另一个复杂类型的扩展。
<s:schema xmlns:tns="http://Example.org" elementFormDefault="qualified"
targetNamespace="http://Example.org" xmlns:s="http://www.w3.org/2001/XMLSchema">
<s:complexType name="LinkList">
<s:sequence>
<s:element minOccurs="0" name="d" type="tns:LinkList" />
<s:element minOccurs="0" name="c" type="s:int" />
</s:sequence>
</s:complexType>
<s:element name="DerivedLinkList">
<s:complexType>
<s:complexContent>
<s:extension base="tns:LinkList">
<s:sequence>
<s:element name="derive1" type="s:int" />
</s:sequence>
</s:extension>
</s:complexContent>
</s:complexType>
</s:element>
</s:schema>
上述 xsd 片段指示 DerivedLinkList 派生自 LinkList。
Wsutil.exe 为 C 和 C++ 生成帮助程序例程,以便应用程序更轻松地设置基类型和派生类型的类型信息。 在以下代码中,_WS_CPLUSPLUS 宏用于区分 C 和 C++ 语言的定义:
#if defined(_WS_CPLUSPLUS)
typedef struct LinkList
{
LinkList();
LinkList(WS_STRUCT_DESCRIPTION*);
struct _DerivedLinkList* WINAPI As_DerivedLinkList();
const struct _WS_STRUCT_DESCRIPTION* _type;
struct LinkList * d;
int c;
} LinkList;
#endif
#if !defined(_WS_CPLUSPLUS)
typedef struct LinkList
{
const struct _WS_STRUCT_DESCRIPTION* _type;
struct LinkList * d;
int c;
} LinkList;
void WINAPI LinkList_Init(LinkList*);
#endif
#if defined(_WS_CPLUSPLUS)
typedef struct _DerivedLinkList:LinkList
{
_DerivedLinkList();
int derive1;
} _DerivedLinkList;
#endif
#if !defined(_WS_CPLUSPLUS)
typedef struct _DerivedLinkList
{
struct LinkList _base;
int derive1;
} _DerivedLinkList;
struct _DerivedLinkList* WINAPI LinkList_As_DerivedLinkList(LinkList*);
#endif
在 C 样式帮助程序中,在序列化之前,应用程序调用 wsutil 生成的例程 LinkList_Init 来初始化结构并将类型说明设置为 LinkList 类型说明。 反序列化后,应用程序可以调用 LinkList_As_DerivedLinkList 来获取派生类型。
若要在运行时检索类型信息,wsutil 会生成具有 WS_STRUCT_DESCRIPTION* 类型和 WS_TYPE_ATTRIBUTE_FIELD_MAPPING 字段映射的基类型的第一个字段,以说明 xsi:type 信息。 应用程序可以直接设置或检查字段以确定结构的实际类型。 例如,以下代码将结构的类型设置为 DrivedLinkList:
_DerivedLinkList derivedLinkList;
derivedLinkList._base._type = (WS_STRUCT_DESCRIPTION*)test_xsd.globalElements.DerivedLinkList.typeDescription;
WsWriteType(
writer,
WS_ELEMENT_TYPE_MAPPING,
WS_STRUCT_TYPE,
(WS_STRUCT_DESCRIPTION*)test_xsd.globalElements.DerivedLinkList.typeDescription,
...);
反序列化结构后,应用程序可以直接比较类型说明以确定反序列化类型:
if (derviedLinkList._base._type == (WS_STRUCT_DESCRIPTION*)test_xsd.globalElements.DerivedLinkList.typeDescription)
{
// the deserialized type is of type _DerivedLinkList
...
}
wsutil 生成基结构和派生结构的类。 默认构造函数初始化类型和匹配类型说明。 AsDerivedType 例程有助于在类型之间执行安全类型转换。
{ // field description for typeOfLinkList
WS_TYPE_ATTRIBUTE_FIELD_MAPPING,
0,
0,
WS_DESCRIPTION_TYPE,
0,
WsOffsetOf(LinkList, typeOfLinkList),
0,
0,
}, // end of field description for typeOfLinkList ...
{
sizeof(LinkList),
__alignof(LinkList),
(WS_FIELD_DESCRIPTION**)&test_xsdLocalDefinitions.globalTypes.LinkListdescs.LinkListFields,
WsCountOf(test_xsdLocalDefinitions.globalTypes.LinkListdescs.LinkListFields),
(WS_XML_STRING*)&test_xsdLocalDefinitions.dictionary.xmlStrings.LinkListTypeName,
(WS_XML_STRING*)&test_xsdLocalDefinitions.dictionary.xmlStrings.LinkListTypeNamespace,
0,
(WS_STRUCT_DESCRIPTION**)&test_xsdLocalDefinitions.globalTypes.LinkListdescs.SubTypes,
1,
}, // struct description for LinkList
nillable
字符串、结构和字节数组支持 nillable 属性。 WS_FIELD_NILLABLE 属性将添加到具有 nillable 属性的字段。 如果元素为 nillable,指针将设置为 NULL。 结构中的 nillable 字段被视为指针。 具有 nillable 属性的参数结构将通过引用传递。
指针
对于 out 参数,值类型必须通过值或引用传递。 除仅 out 结构外,不允许使用双指针。
无参数
请回顾我们之前关于消息部分“参数”名称的讨论。 如果指定了此项,我们将尝试为生成的服务操作生成输入和输出消息的组合帧。 如果未指定,则生成的服务操作将包含结构形式的输入和输出消息作为参数。
<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tns="http://Sapphire.org"
xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy"
xmlns:wsap="http://schemas.xmlsoap.org/ws/2004/08/addressing/policy" xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:msc="http://schemas.microsoft.com/ws/2005/12/wsdl/contract" xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl"
xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:wsa10="http://www.w3.org/2005/08/addressing"
xmlns:wsx="http://schemas.xmlsoap.org/ws/2004/09/mex" targetNamespace="http://Sapphire.org"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
<wsdl:message name="ISimpleService_SimpleMethod_InputMessage">
<wsdl:part name="noparameters" element="tns:SimpleMethod" />
</wsdl:message>
<wsdl:message name="ISimpleService_SimpleMethod_OutputMessage">
<wsdl:part name="noparameters" element="tns:SimpleMethodResponse" />
</wsdl:message>
</wsdl:definitions>
因此,对于 SimpleMethod 操作,服务的签名和客户端将如下所示。
typedef HRESULT (CALLBACK *SimpleMethodCallback)
(const WS_OPERATION_CONTEXT* context,
SimpleMethodRequest* inMessage,
SimpleMethodResponse** outMessage,
const WS_ASYNC_CONTEXT* asyncContext,
WS_ERROR* error);
HRESULT CALLBACK SimpleMethod (
WS_SERVICE_PROXY* serviceProxy,
WS_HEAP* heap,
SimpleMethodRequest* inMessage,
SimpleMethodResponse** outMessage,
const WS_ASYNC_CONTEXT* asyncContext,
WS_ERROR* error);
安全性
请参阅 Wsutil 编译器工具和序列化中的“安全性”部分