2009-02-12 28 views
3

我的公司正在開發一個應用程序,通過TCP套接字和xml消息從另一家公司接收數據。這將傳送到單個網關應用程序,然後將其廣播到我們組織中各個機器上的相同內部應用程序的多個副本。WCF:個別方法或接受xml的通用ProcessMessage方法

WCF被選爲處理內部通信(內部雙向)的技術。開發人員考慮了兩種方法。

  1. 由 WCF服務用於由網關 應用接收到的每個不同 消息暴露各個方法。網關 應用程序將解析傳入的 外部消息並調用適當的WCF服務方法。傳入的XML將被轉換爲 爲DataContract DTO's並提供 作爲適當的WCF 方法的參數。

  2. 內部應用 暴露與一種 方法「ProcessMessage的」,其 接受XML字符串消息作爲 參數的WCF服務。內部應用程序將 解析然後反序列化收到的 xml並相應地處理它。

主要開發人員認爲選項二是更好的選擇,因爲它更容易序列化/反序列化xml。我認爲這個論點沒有道理,因爲DataContracts是由WCF序列化和反序列化的,並且通過使用WCF我們有更好的數據輸入方式。在選項2中,有人可以調用WCF服務並傳遞任何字符串。我相信選項1提供了一個整潔的界面,使應用程序更易於維護和使用。

這兩個選項在某些時候仍然需要解析和驗證原始的xml字符串,所以它也可能是一個問題,在哪裏推薦這個驗證的地方。

我想知道目前的想法是爲了傳遞這種信息,以及人們對兩種選擇的看法。

回答

0

我最近問了一些關於這方面的問題:XML vs ObjectsXML vs Objects #2。你會發現有趣的問題的答案。

對於我們的具體問題,我們已經決定了hybrod方法,與界面看起來像這樣:

// Just using fields for simplicity and no attributes shown. 
interface WCFDataContract 
{ 
    // Header details 
    public int id; 
    public int version; 
    public DateTime writeDateTime; 

    public string xmlBlob; 

    // Footer details 
    public int anotherBitOfInformation; 
    public string andSoemMoreInfo; 
    public book andABooleanJustInCase; 

} 

我們使用xmlBlob的原因是因爲我們自己的頁眉和頁腳的模式,但不是一滴在中間。另外,我們並不需要處理該blob,而是將它傳遞給另一個庫(由另一個部門創建)。另一個庫向我們返回更強的類型數據。

祝你好運 - 經驗告訴我,你的選項2可以說是相當誘人的,有時是很難反駁而不被指責爲過於純潔,不夠務實;)

+0

感謝您的鏈接。非常感激 :) – 2009-02-17 20:46:23

0

我希望我能理解這個權利。我認爲讓你的網關應用程序處理所有的反序列化並讓你的內部應用程序公開帶有實際的DataContract對象的WCF服務是有意義的。

這樣,基於TCP的XML的反序列化就更集中於網關,而您的內部應用程序不需要擔心它,他們只需要公開任何WCF服務的意義,並且可以處理實際的物體。

如果您強制內部應用程序進行反序列化,那麼如果格式更改或其他方式可能會導致更多維護。

所以我想我會說選項1(除非我誤解了)。

+0

你理解錯:)這就是同樣的結論我來了。內部應該公開真正的服務,網關應該處理反序列化和廣播/路由。 – 2009-02-12 03:32:15

1

如果您可以確保客戶端始終將數據合約的序列化表示形式發送到服務器,則選項1適用。

但是,如果您需要序列化/反序列化邏輯中的某些靈活性,並且不與DataContracts緊密耦合,那麼選項2看起來不錯。當你想支持XML(說凌表示,在自定義格式等原始XML)

此外,在方案2中的ProcessMessage()方法中的替代形式特別有用,你必須決定是否到的選項反序列化傳入的xml有效內容(基於請求頭或特定於您的應用程序的內容)。

在選項1中,WCF運行時將總是對負載進行反序列化。