2009-03-11 22 views
16

WCF'yi kullanmaya başladım ve zaten bir proje değiştiren konuya geldim. Bir hizmet oluşturdum ve bir web servisine başvurdum, ancak webservice xml dosyasındaki her alan bir ExtensionData alanıyla geliyor.WCF: ExtensionData alanını kaldırmanın bir yolu var mı?

Örnek:

kaldırıldı ölü ImageShack bağlantı

Bunu istemiyorum. Ben sadece olması gerekir:

kaldırıldı ölü ImageShack bağlantı

bu alanı kaldırmak için bir yol var mı? Bazı farklı tür serileştirme?

+0

Daha spesifik olabilir misiniz? "Xml dosyasındaki her alan" derken ne demek istiyorsun? XML dosyalarında alanlar yok. ExtensionData'yi nerede görüyorsunuz, ve neden bu bir sorun? –

cevap

2

ExtensionData, farklı sürümlerin sözleşmelerini paylaşabilecek servisler arasında uyumluluğu korumak için kullanılır. Mesajları iletirken güvenli bir şekilde göz ardı edilebilir.

DataContract serileştiricisi (eski okul [Serializable] imgesinden başka bir şey) kullanarak bir şeyden kurtulabilirsiniz, ancak yanılıyor olabilirim.

10

ExtensionData, aslında round-tripping'u etkinleştirmek için türünde bulunması gereken bir özelliktir. DataContractSerializer tarafından her zaman yayılır. Bu alanın'u baskılayan olası bir yolu, XmlSerializerFormatAttribute ile hizmet sözleşmesi arayüzünüzü oluşturarak eski XmlSerializer kullanıyor.

+0

bu aptalca çünkü bir PUT için nesneyi karşılaştırmaya çalışıyorsanız ve aynı nesnenin geri geldiğinden emin olun, ünite sınamaları, yanıttaki verilere sahip olan ancak – PositiveGuy

+0

@MSSucks isteğinde bulunmayan bu aptal alan nedeniyle başarısız olabilir Ünite testleriniz, geç veya çalışma zamanı bağlama yoluyla değil, statik olarak kontrol edilmeli mi? – moarboilerplate

0

MSDN http://msdn.microsoft.com/en-us/library/ms731083.aspx itibaren

... soruya cevap, ama belki bu yardımcı olur Değil:

yuvarlak açma özelliği DataContractSerializer yapıcı true ignoreExtensionDataObject ayarlayarak veya ya kapalı olabilir ServiceBehaviorAttribute üzerinde IgnoreExtensionDataObject özelliğini true olarak ayarlayarak. Bu özellik kapalı olduğunda, deserializer, ExtensionData özelliğini doldurmaz ve serializer, özelliğin içeriğini yaymayacaktır.

+2

Değeri true olarak ayarlamak ExtensionData özelliğini yok etmez; Varsa, istemciye veri göndermeyi engeller. –

3

Büyük olasılıkla, DataContract sınıflarınız IExtensibleDataObject arabirimini uygular, değil mi? Bu ExtensionData alanından sorumludur - sadece bu arabirimi kaldırın ve DataContracts öğesinden de ExtensionData alanlarını kaldırabilmeniz gerekir.

Marc

+6

Ancak arayüz kapalı, nasıl kaldırabilirsiniz? – SteveC

-1

null o çıkan xml görünmesini engellemek için [ServiceBehavior (true IgnoreExtensionDataObject =)]

[ServiceBehavior(IgnoreExtensionDataObject=true)] 
public class Service : IService {} 
2

özelliğinin ayarlanması ile ServiceImplementation süslemek:

foreach(var elem in arrayOfElements) 
{ 
    elem.ExtensionData = null; 
} 
+0

Hackler kullanmayı sevmediğim kadarıyla, bu çok hızlı (geçici) bir çözümdü. +1 –

0

ise Sorununuz bir [TestMethod] iddiasında, her ExtensionData propertini hariç tutmak için http://www.fluentassertions.com'u kullanabilirsiniz. İddialarınızdan.

Ör.

objToCheck.ShouldBeEquivalentTo(expectedObj, options => options.Excluding(o => o.ExtensionData)); 
0

Sınıfınız IExtensibleDataObject miras olmamalıdır.

açıklamasına bakınız Gidiş-açma aşağıda: Veri eski bir sürümüne yeni bir sürümünü transfer ve veri sözleşmesi yeni sürümüne transfer edildiğinde

Yuvarlak açma gerçekleşir. Baypas, verinin kaybolmamasını sağlar. Baypasın devre dışı bırakılması, türün sözleşmeli versiyon modeli tarafından desteklenen gelecekteki değişikliklerle uyumlu olmasını sağlar.

gezi-açma belirli bir türü için, tip

IExtensibleDataObject

arayüzünü çalıştırmak gerektiğini sağlamak.

Kullanıcı arabirimi bir ExtensionData (ExtensionDataObject) özniteliği içerir. Mülkiyet, mevcut sürümle bilinmeyen veri sözleşmesinin gelecekteki sürümlerinden bilgileri depolar.

İlgili konular