2009-09-30 9 views
6

WCF'yi xs'yi nasıl kullanırsınız: Tümü xs yerine: Bir web hizmeti için wsdl/xsd'deki karmaşık nesne türlerini tanımlarken sıralama?WCF'yi xs'yi kullanmaya nasıl zorlarsınız: Tümü xs yerine: SOAP öğesi sıralaması alakasız mı?

Karşılaştığım sorun şu ki xs: Sıra arama uygulamalarının, soap mesajındaki öğeleri WCF tarafından oluşturulan xsd'de belirtilen sıraya geçirmesini gerektirir (bu varsayılan olarak alfabetiktir). xs: Hepsi (veya bu konuyla ilgili seçenek) siparişi umursamıyor.

Bu davranış bir yerde basit bir yapılandırma seçeneğiyle değiştirilebilir mi?

+0

Gerçekten istiyorsanız, WSDL'yi oluşturmak için kendi uzantınızı yazabilirsiniz - bu tamamen önemsiz değil, ancak yapılabilir. "WCF WSDL eklentisi" için web'de arama yapın - orada bir kaç örnek bulunmalıdır. –

cevap

3

Başımın tepesinden, yapamayacağınızı düşünüyorum. Bunun yerine, WSDL dosyasını elle yazıp, kodu oluşturmak için svcutil.exe aracını kullanmaktır.

Tek yapmanız gereken öğelerin alfabetik olarak sırayla farklı bir sırayla düzenlenmesidir, [DataMember] özniteliğinde Order (1'den başlayarak değil, 0 gibi dizilerle) parametresini kullanarak, DataContract öğesindeki öğeleri sipariş edebilirsiniz. [DataMember (Order = 1)], [DataMember (Order = 2)], vb.

+1

+1 kafanızda çivilenmiş olabilirsiniz - WCF'yi xs kullanmak için kullanmanın bir yolu yoktur: hepsi xs yerine: sequence –

+0

Bir keresinde bir WCF sorusunu cevaplamak için zamanım olduğundan daha hızlı bir şekilde :) – Philippe

+0

Teşekkürler, bunun böyle olabileceğini düşündüm. –

2

WCF'yi DataContractSerializer yerine XmlSerializer'ı kullanmak için değiştirebilirsiniz. XmlSerializer xs'yi destekler: hepsi. WCF'yi bunu yapmaya zorlayabilseniz bile, desperizer girişi desteklemek için doğru şekilde çalışmayacaktır. Bkz. http://msdn.microsoft.com/en-us/library/ms733901.aspx

0

Aşağıdaki örnekler ve açıklamalar.

Giriş 1 (iyi): 2 (kötü)

<MyOperation> 
    <AField>value A</AField> 
    <BField>value B</BField> 
</MyOperation> 

Girişi: Giriş 1 doğru serileştirilemezse eğer

<MyOperation> 
    <BField>value B</BField> 
    <AField>value A</AField> 
</MyOperation> 

Yani, o zaman giriş 2 olmaz - BField bir değere sahip olacağını ayarlandı, ancak özellik AField boş olacaktı.

WCF bu sıra dışı girişi işleyemiyorsa, bunun bir istisna atması gerektiğini düşünmekteyim, ancak benim sınamamıza dayanarak (.NET 3.5 in IIS) bunu yapmaz, yalnızca bazı öğe değerlerini atlar . Ayrıca, WCF, aradığı geçerli öğe değerlerini etkilemediği sürece, tamamen sahte girişi de yok sayar. Ayrıca; Yani bu giriş

<MyOperation> 
    <bogusField>with or without data</bogusField> 
    <AField>value A</AField> 
    <bogusField2 /> 
    <BField>value B</BField> 
    <bogusField3></bogusField3> 
</MyOperation> 

hataları atmak olmaz ve aslında uzak ve BField değerleri serisini olacaktır.