2016-04-25 105 views
2

我正在使用具有各種方法的Web服務,其中之一需要xml作爲輸入。肥皂服務方法類定義c#

有一個結構需要傳遞以獲得正確的響應。

我已經在Visual Studio中添加了服務引用,並且可以在它生成的合同類中看到該方法。

如何創建正確的類,而無需獲取.xsd文件並運行xsd.exe來生成類?由於未來可能會更改爲xml格式,因此我需要再次運行xsd.exe,這並不好。

任何想法將是巨大的

感謝

+0

你有訪問網絡服務組件?特別是包含服務定義的程序集? –

+0

Web服務需要一個類還是文本?如果它只是文本,那麼你所需要做的就是讀取xml文件並以文本形式發送。一個序列化的類將產生與文本xml文件相同的xml文件,所以將序列化xml文件(創建類)僅僅用於序列化(創建文本)相同的文本是否有意義? – jdweng

回答

1

由於有可能在未來的XML格式的變化,那麼我會 需要再次運行XSD.EXE這是不好的。

您完全正確的是,生成服務合約定義的客戶端表示形式並不好。最好引用服務程序集中的實際服務定義,然後在運行時使用ChannelFactory<T>構建您的通道。由於許多原因,這比使用生成的服務引用要優越得多。

只有兩件事情可以在您的方式站在這個方法:

  1. 您沒有訪問該服務的二進制文件。觀察你必須能夠使用用於定義服務的實際類型。
  2. 服務二進制文件可用,但被編譯爲一個「超級程序集」,其中包含各種您不關心的東西,不一定要從您的客戶端應用程序中使用。

如果第一上述兩個條件爲真,那麼抱歉,但必須使用XSD.EXE求助於生成的客戶端代理,並接受所有懲罰,這incurrs。如果第二個條件成立,您可能會要求服務所有者將服務定義代碼提取到單獨的程序集中,並且您可以使用所描述的方法正常進行。

我手邊的類,所以可以使用XML序列化...做我只是創造一個 和的SoapEnvelope然後生成的XML追加到 請求的主體?

我假設服務也使用WCF?

使用像WCF這樣的框架的一點是,您不需要關心從客戶端到服務端的數據的序列化,編碼和傳輸。 WCF爲您處理所有這些事情。你所需要做的就是使用服務定義創建WCF通道(通常這是一個將服務操作定義爲接口上的方法的接口)。

然後,您可以針對通道實例調用這些方法,並將請求序列化爲XML,包裝在SOAP包裝器中,然後通過HTTP傳輸到請求已接收,解包和反序列化的服務任何努力。

這裏有一個例子:https://stackoverflow.com/a/8869809/569662

+0

嗨,感謝您的回覆。看起來他們會很靈活,因爲我們需要向他們提供表示,所以我有手頭的類,所以可以使用xml序列化器。但是使用xml請求調用服務,我只是創建一個soapEnvelope,然後將生成的xml附加到請求的主體? – tjhack

+0

@tjhack我已經更新了我的答案 –