2010-02-27 179 views
3

我必須使用C#程序調用webservice。 web服務很可能不是標準格式。接口描述(wsdl和xsd)非常複雜,使用代理生成機制會導致數百個類。生成的類沒有什麼幫助,因爲它們是非常通用的,主要具有簡單的對象類型作爲成員。最好的選擇是手動構建SOAP消息。這也是Web服務提供者建議選擇的方式:根據模板獲取必須發送的soap/xml消息並構建消息。現在的問題是如何最有效地構建消息。當然硬編碼的消息字符串是一種選擇,但我想知道是否有更好的選擇。如果我在一個字符串中有完整的消息,我該如何最好地發送消息。我應該使用簡單的HttpRequest還是可以使用wcf堆棧的機制? 我現在的建立消息的做法是這樣的:在沒有代理的情況下調用web服務

string msg = envelopeBegin; 
RouteType rootType = new RouteType(); 
XmlSerializer serializer = new XmlSerializer(typeof(RouteType)); 
StringWriter stringWriter = new StringWriter(); 
serializer.Serialize(stringWriter, rootType , customNamespace); 
msg += stringWriter.ToString(); 
msg += envelopeEnd; 

//發送消息,在導線

的SOAP/XML消息,我不得不產生這樣的

<env:Envelope>xmlns:env=http://schemas.xmlsoap.org/soap/envelope/ xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns0="http://www.skanska.se/oagis/9/ws/faults"> 
<env:Body> 
<ska:ShowSalesOrder xmlns:ska="http://www.skanska.se/oagis/9" systemEnvironmentCode="UTV" versionID="1.0" releaseID="9.0"> 
<!--plsql=.74s--> 
<ApplicationArea xmlns="http://www.openapplications.org/oagis/9"> 
<!--user_name=SEBA_RAPPE--> 
<ska:Sender> 
<LogicalID>OEBS_SE</LogicalID> 
<ComponentID>SKAIS017I</ComponentID> 
<AuthorizationID>SEBA_RAPPE</AuthorizationID> 
<ska:ResponsibilityID>XXOM_INTEGRATION_SVT</ska:ResponsibilityID> 
</ska:Sender> 
<CreationDateTime>2010-02-26T15:03:27+01:00</CreationDateTime> 
<BODID>xxxxxxxxxxxxxxxxx</BODID> 
</ApplicationArea> 
<ska:DataArea> 
<Show xmlns="http://www.openapplications.org/oagis/9"> 
<ResponseCriteria> 
<ResponseExpression actionCode="Never" expressionLanguage="xPath">*</ResponseExpression> 
</ResponseCriteria> 
</Show> 
<ska:SalesOrder> 
<SalesOrderHeader xmlns="http://www.openapplications.org/oagis/9"> 
<DocumentID> 
<ID>141779</ID> 
</DocumentID> 
<RequestedShipDateTime>2009-11-04T07:00:54+01:00</RequestedShipDateTime> 
</SalesOrderHeader> 
</ska:SalesOrder> 
</ska:DataArea> 
</ska:ShowSalesOrder> 
</env:Body> 
</env:Envelope> 

回答

0

外觀一種方法是創建一個包含值的佔位符的XML骨架模板。閱讀XML並將其替換爲來自對象的值。使用HttpWebRequest將生成的XML發佈到Web服務。

即使這種方法可能工作,我強烈建議您創建一個WCF代理類並使用它來代替,即使Web服務包含數百個未使用的方法和對象。只要它是一個有效的WSDL,WCF就會處理它。此外,如果Web服務發生任何更改,您只需重新生成代理即可。爲了避免這個Web服務的醜陋,創建你自己的基礎結構,只公開有用的方法和類並隱藏真正的調用。

2

您完全可以繼續使用WCF基礎結構,而不需要所有各種消息的類型定義。 WCF通過Message類特別支持這一點。使用它並不是那麼困難。以下是關於它們的更多信息,但基本上你會使用XML讀取器和編寫器來讀取和寫入消息。

Using the Message Class

+0

是的,這可能是真實的 - 你可以使用非類型化的消息類的實例 - 但你不能沒有通過WCF客戶端代理棧去調用基於SOAP的WCF服務.... – 2010-02-27 23:04:57

+0

是啊,這這個想法。他仍然可以從WCF客戶端渠道和基礎設施中獲益,但卻沒有大量客戶端類型定義。當你只需要10種左右的類型時,這可能是一種痛苦,WSDL定義了數百種。 – Josh 2010-02-27 23:07:35

+0

@marc_s:如果你願意,你可以使用一個原始的TCP套接字來訪問一個WCF服務,但是他們需要做很多工作,HttpWebRequest會更容易。 「WCF客戶端代理棧」是什麼意思?創建一個從System.ServiceModel.ClientBase派生的自定義代理很簡單,而不必訴諸VS.Net創建的詳細代理。 – sipwiz 2010-02-27 23:10:58

相關問題