2009-04-03 16 views
5

'dan ServiceKnownType özniteliğini alamıyor ServiceKnownType örneğini MSDN'den uygulamayı denediğimde bir sorunla karşılaştım.svcutil, oluşturulmuş arabirim proxy'si

[DataContract()] 
public class Widget 
{ 
    [DataMember] 
    public string Id; 
    [DataMember] 
    public string Catalog; 
} 

[DataContract()] 
public class Machine : Widget 
{ 
    [DataMember] 
    public string Maker; 
} 

Ve aşağıdaki arayüz:

[ServiceKnownType(typeof(Widget))] 
[ServiceKnownType(typeof(Machine))] 
[ServiceContract()] 
public interface ICatalog 
{ 
    [OperationContract] 
    Hashtable GetItems(); 
} 

sorun vekil sınıfı oluşturulduğunda (“Hizmet başvurusu Ekle” seçeneğini kullanarak olmasıdır/svcutil.exe aşağıdaki sınıfları sağlamak örnekte ), “ServiceKnownType” öznitelikleri ICatalog proxy arabiriminden çıkarılarak bir istisnayla sonuçlanır. “Biçimlendirici, iletinin seri halini almaya çalışırken bir istisna attı:… " Widget "e karşılık gelen türü bilinen türler listesine ekle ” Bu sorunu çözmek için, hizmetin bilinen özniteliklerini, oluşturulan proxy arabirimine el ile eklemeliyim. Bu, kodu güncelleştirdiğimde yeniden üretildiğinden çok kötü bir çözümdür. tüm bu durumda ilginç şey, yani GetItems operasyon yerine Hashtable nesne veya bir nesne parametre olarak almak dönecekti eğer, o zaman sorun çözülecektir olacağını

[OperationContract] 
object GetItems(); 

veya

[OperationContract] 
Hashtable GetItems(object obj); 
olduğunu ICINlog proxy arabiriminde “ServiceKnownType” özniteliğinin varlığında

sonuçları. Bu sorunun nasıl çözüleceğini bilen var mı?

Teşekkür

cevap

0

ilgili problem gibi görünüyor.

Genel Sözlükler Sözlüğünü döndürmeyi ve [KnownType(typeof(Machine))] Widget sınıfına koymayı denediniz mi?

+3

ServiceKnownType ile çalışmasını ve KnownType ile çalışmamasını istiyorum çünkü benim gerçek dünya senaryomda, değiştiremediğim bir DLL'de bulunduğundan “Widget” sınıfında bir özellik ekleyemiyorum.Senaryo için başka bir çözüm için minnettar olurum ama aynı zamanda MSDN örneğinin neden çalışmadığını bilmek istiyorum – Andy

1

Bugün saatlerce, anlatabildiğim kadarıyla, aynı sorunun ne olduğu üzerine çalıştım. Benim için çözüm, IDesign'ın ServiceModelEx kitaplığından AddGenericResolver yöntemini kullanmaktı.

NOT: DataContractResolver

kullanır .NET 4.0 Sen IDesign Downloads page üzerinde bulabilirsiniz gereklidir.

Client.AddGenericResolver(typeof (K2Source)); 

umarım bu orada birkaç saat tasarruf başkası yardımcı olur:

benim durumda yapılacak tek şey aşağıdaki kod satırını ekleyin oldu!

Kitaptaki fazla bilgi bulabilirsiniz "Programlama WCF Hizmetler: Mastering WCF ve Azure AppFabric Servis Otobüsü" Svcutil tarafından göz ardı ServiceKnownType ile Juval Lowy

0

Problem tarafından hala burada.

var client = new ServiceReferenceClient("clientEndpoint"); 
foreach (var o in client.Endpoint.Contract.Operations) 
{ 
    o.KnownTypes.Add(typeof(MyType01)); 
    o.KnownTypes.Add(typeof(MyType02)); 
    o.KnownTypes.Add(typeof(MyType03)); 
} 

O mükemmel bir çözüm (sert istemci tarafında kodlu olmalıdır) değil ama benim için çalışıyor: Benim çözümüm programlı istemci sözleşme referansına "bilinen türleri" eklemektir.