我正在使用 Delphi 10.4.2 并且我正在撰寫一個 SOAP 服務器應用程式。為了生成 WSDL,我使用了一個放在我的 TWebModule 后代上的 TWSDLHTMLPublish 組件。我遇到了將屬性和可選元素暴露到 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;
// ================================================================================
{$REGION ' ==================== ProjektFilterType ===================='}
Function ProjektFilterType.Status_Specified(Index: Integer) : Boolean;
begin
Result := FStatus_Specified;
end;
Function ProjektFilterType.OrderDir_Specified(Index: Integer) : Boolean;
begin
Result := FOrderDir_Specified;
end;
Function ProjektFilterType.OrderField_Specified(Index: Integer) : Boolean;
begin
Result := FOrderField_Specified;
end;
Procedure ProjektFilterType.SetStatus(Index: Integer; const Value: ProjektStatus);
begin
FStatus := Value;
FStatus_Specified := true;
end;
Procedure ProjektFilterType.SetOrderDir(Index: Integer; const Value: OrderDirection);
begin
FOrderDir := Value;
FOrderDir_Specified := true;
end;
Procedure ProjektFilterType.SetOrderField(Index: Integer; const Value: ProjektOrderField);
begin
FOrderField := Value;
FOrderField_Specified := true;
end;
{$ENDREGION}
// ================================================================================
輸出 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 屬性嗎?
uj5u.com熱心網友回復:
好的,我在 Embarcaqdero Sourrces 中找到了這個:
注意:目前序列化選項僅供客戶端使用。即它們由 WSDL 匯入器在從 WSDL 創建型別時使用。服務器應該不注冊任何型別的這些選項的WSDL發布邏輯將忽略所有的序列化選項。IOW,這些標志在這里是為了使語言系結適應不容易映射到本機型別的構造 - 就像具有屬性的陣列的示例。服務器不需要使用任何這些標志,因為服務器的所有需求都可以映射到 SOAP,而無需使用持有者類。
所以我將手工生成我的 wdsl 并使用 wsdl-importer 來生成介面單元。我希望有一種更簡單的方法(對我來說:-))但我可以忍受這個......
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/315600.html
上一篇:如何讓fmxlistbox.ScrollToItem用于表單創建或激活
下一篇:Delphi中的位元組交換順序
