2014-02-05 175 views
0

我有以下WCF服務,我相信可以改進。我需要能夠使用SOAP1.1和SOAP1.2來支持Windows和非Windows客戶端。WCF服務和互操作性

我的疑慮是API InitDataRequest的輸入參數initdata和GetData的返回參數。目前,我們制定了一項發展政策,即將這些參數限制爲XML格式的字符串,客戶端和服務器負責在各自的環境中進行序列化/反序列化。

[ServiceContract] 
public interface IAtomDataInterfaceWcf 
{ 
    [OperationContract] 
    Guid OpenSession(AtomSessionType sessiontype); 

    [OperationContract] 
    void CloseSession(Guid sessionid); 

    [OperationContract] 
    int InitDataRequest(Guid sessionid, string initdata); 

    [OperationContract] 
    string GetData(Guid sessionid, int count); 
} 

使用SoapUI,InitDataRequest的SOAP請求顯示參數'initdata'的以下元素。

<tem:initdata>?</tem:initdata> 

這讓我們期待別的東西的IBM Websphere開發人員感到困擾。他們建議,在沒有任何指導的情況下,我使用XSD來描述API,從而爲這些參數提供了更多的結構,但是我一直沒能弄清楚如何使用它。

任何想法?

在此先感謝。

回答

2

對於您的服務合同,沒有任何固有的不可互操作性。我不確定爲什麼你認爲有改進的餘地,除非聯繫人不支持其所要解決的商業原因。

您可以通過分別爲每個basicHttpBinding和wsHttpBinding定義一個端點來通過soap 1.1和1.2公開該服務。

我不知道你這個是什麼意思:

我們有一個發展的政策,這些參數被限制 是XML格式的字符串

肥皂是一種XML標準;所有非xml內容都必須格式化,否則最終會出現不良xml。這不是一項發展政策,而是技術約束。

我也不明白什麼問題是用soapUI初始設置字符串值initdata爲問號。你是否擔心這在某種程度上不是有效的字符串?你意識到soapUI只是把「?」最初,你可以改變它到任何你想要的權利?

最後,如果你的服務的消費者說他們需要一個xsd,那麼你可以到host a WSDL endpoint,他們可以去那個終端並從那裏下載xsd。

1

上述問題的答案是正確使用KnownType屬性。使用它可以讓我重寫我的接口,像這樣:

[ServiceContract] 
public interface IAtomDataInterfaceWcf 
{ 
    [OperationContract] 
    int InitDataRequest(Guid sessionid, AtomDataRequest initdata); 

    [OperationContract] 
    Guid OpenSession(AtomSessionType sessiontype); 

    [OperationContract] 
    void CloseSession(Guid sessionid); 

    [OperationContract] 
    AtomDataResponse GetData(Guid sessionid, int count); 
} 

凡AtomDataResponse和AtomDataRequest具有以下結構。

[KnownType("GetKnownTypes")] 
[DataContract] 
public class AtomDataRequest 
{ 
    public static Type[] GetKnownTypes() 
    { 
     // load known types derived from AtomDataRequest and return as Type array 
    } 
} 

這些改變後,我的WSDL現在是一個豐富的文件,它允許消費者調用API的具有良好定義的對象而不是XML格式的字符串。