delphi TWSDLHTMLPublish生成错误的wsdl?

wfveoks0  于 2023-08-04  发布在  其他
关注(0)|答案(1)|浏览(88)

我使用的是 Delphi 10.4.2,编写一个SOAP服务器应用程序。为了启动WSDL,我使用了一个TWSDLHTMLPublish组件,它放在我的TWebModule Descendant上。我在将属性和可选元素暴露到wsdl文件中时遇到了问题。
我的接口定义对象如下:

// TRemotable Property Index constants.
// Quelle: http://www.codenewsfast.com/cnf/article/0/permalink.art-ng1920q2865
const
  IS_OPTN = $0001;   // This element is optional (minOccurs=0); Don't serialize it if its value was not explicitly set
  IS_UNBD = $0002;   // This array element is unbounded (The runtime serializes dyn arrays as either collection or unbounded elements)
  IS_NLBL = $0004;   // This element is nillable (xsi:nillable=true)
  IS_UNQL = $0008;   // This element is unqualified (see http://www.w3schools.com/schema/el_schema.asp) Runtime defaults to qualified otherwise
  IS_ATTR = $0010;   // This property is an attribute (otherwise the runtime serializes it as an element)
  IS_TEXT = $0020;   // This property is text (typically of the parent element) (see http://www.w3schools.com/schema/schema_complex_text.asp)
  IS_ANY  = $0040;   // This property represents an xsd:any element (not really used by runtime)
  IS_REF  = $0080;   // This property is a ref (i.e. ref=QName) element (see http://www.w3schools.com/schema/el_element.asp)
  IS_QUAL = $0100;   // This attribute is qualified (the runtime defaults to unqualified otherwise)

type
  OrderDirection    = (OrderNONE, OrderASC, OrderDESC);
  ProjektOrderField = (pofNONE, pofID, pofNummer, pofStatus);
  ProjektStatus     = (psAll, psAnfrage, psAuftrag, psAbgeschlossen);

ProjektFilterType = class(TRemotable)
  private
    FStatus               : ProjektStatus;
    FStatus_specified     : Boolean;
    FOrderField           : ProjektOrderField;
    FOrderField_specified : Boolean;
    FOrderDir             : OrderDirection;
    FOrderDir_specified   : Boolean;
    FTestAttribut         : string;
    Procedure SetStatus          (Index: Integer; const Value: ProjektStatus);
    Procedure SetOrderDir        (Index: Integer; const Value: OrderDirection);
    Procedure SetOrderField      (Index: Integer; const Value: ProjektOrderField);
  public
    Function Status_Specified    (Index: Integer) : Boolean;
    Function OrderDir_Specified  (Index: Integer) : Boolean;
    Function OrderField_Specified(Index: Integer) : Boolean;
  published
    property TestAttribut : string             Index (IS_UNQL OR IS_ATTR)  read FTestAttribut  write FTestAttribut;
    property Status       : ProjektStatus      Index (IS_UNQL OR IS_OPTN)  read FStatus        write SetStatus       stored Status_specified;
    property OrderField   : ProjektOrderField  Index (IS_UNQL OR IS_OPTN)  read FOrderField    write SetOrderField   stored OrderField_specified;
    property OrderDir     : OrderDirection     Index (IS_UNQL OR IS_OPTN)  read FOrderDir      write SetOrderDir     stored OrderDir_specified;
  end;

个字符
输出WSDL文件如下所示:

<xs:complexType name="ProjektFilterType">
  <sequence xmlns="http://www.w3.org/2001/XMLSchema">
    <xs:element name="TestAttribut" type="xs:string"/>
    <xs:element name="Status" type="ns1:ProjektStatus"/>
    <xs:element name="OrderField" type="ns1:ProjektOrderField"/>
    <xs:element name="OrderDir" type="ns1:OrderDirection"/>
  </sequence>
</xs:complexType>


问题:IS_ATTR根本不工作-输出是xs:element而不是xs.attribute,元素缺少MinOccurs=“0”和MaxOccurs=“1”属性。
我做错了什么?除了属性索引之外,还需要定义任何RTTI属性?

pgky5nke

pgky5nke1#

好吧,我在Embarcaqdero的来源中找到了这个:

  • 注意:当前序列化选项仅适用于客户端。也就是说,它们由WSDL导入器在从WSDL创建类型时使用。服务器不应该使用这些选项注册任何类型,因为WSDL发布逻辑将忽略所有序列化选项。在这里,这些标志是为了使语言绑定适应那些不容易Map到本地类型的构造-比如带有属性的数组的例子。服务器不需要求助于这些标志中的任何一个,因为服务器的所有需求都可以Map到SOAP,而不需要使用保持器类。

因此我将手工生成wdsl,并使用wsdl-importer生成接口单元。我希望有一个更简单的方法(对我来说:-)),但我可以接受这个...

相关问题