Delphi 10.4.2中TWSDLHTMLPublish生成WSDL属性与可选字段不生效问题
Delphi 10.4.2 SOAP WSDL生成异常解决方案
IS_ATTR标记不生效问题修复
- 删除你自定义的所有IS_*常量定义,直接引用
SOAP.Consts单元使用Delphi官方提供的常量,避免自定义常量优先级问题导致标记失效 - 打开TWSDLHTMLPublish组件的属性面板,在
Options中勾选soDocument、soLiteralParams,只有文档/字面量模式的WSDL才支持解析IS_ATTR标记生成xs:attribute节点,Delphi默认的RPC编码模式不支持该特性 - 确认工程编译选项中「扩展RTTI」功能已开启:路径为工程选项->Delphi编译器->输出->生成扩展RTTI,设置为True,TRemotable的属性索引标记依赖扩展RTTI才能被WSDL生成器识别
- 上述配置完成后仍不生效的,可在单元初始化段手动注册属性的序列化规则:
uses SOAP.Consts, Soap.IntfInfo, Soap.RemRegistry; initialization RemClassRegistry.RegisterXSClass(ProjektFilterType, '你的服务命名空间URI'); RemTypeRegistry.RegisterAttributeTypeInfo(TypeInfo(string), 'TestAttribut', '你的服务命名空间URI');
可选元素缺少minOccurs="0"问题修复
- 确认TWSDLHTMLPublish组件
Options中已勾选soProcessNillable、soSendDefaultInstances,开启后生成器会自动解析IS_OPTN标记和stored方法生成对应的minOccurs属性 - Delphi 10.4.2存在枚举类型可选属性生成缺陷,需要给枚举类型添加
[SoapEnum]特性修饰:
type [SoapEnum] OrderDirection = (OrderNONE, OrderASC, OrderDESC); [SoapEnum] ProjektOrderField = (pofNONE, pofID, pofNummer, pofStatus); [SoapEnum] ProjektStatus = (psAll, psAnfrage, psAuftrag, psAbgeschlossen);
- 仍不生效的可手动在初始化段给属性注册可选标记:
initialization RemClassRegistry.RegisterPropertyOptions(ProjektFilterType, 'Status', [poOptional]); RemClassRegistry.RegisterPropertyOptions(ProjektFilterType, 'OrderField', [poOptional]); RemClassRegistry.RegisterPropertyOptions(ProjektFilterType, 'OrderDir', [poOptional]);
内容的提问来源于stack exchange,提问作者Erwin Sienknecht
相关产品推荐
相关产品推荐

