2009-03-16 28 views
8

Yeni bir uygulama için WCF kullanarak uygulamak istediğimiz mevcut bir SOAP web hizmeti arabirimimiz var. Bu küçük bir detay dışında iyi çalışıyor gibi görünüyor. Bir işlevin dönüş türünün XML ad alanı, web hizmetinin kendisinin XML ad alanından farklı olmalıdır. Ve hayatım boyunca, işe yaramayacağım.WCF XML serileştirmesi nasıl özelleştirilir

Aynı sorunu küçük bir örnek projeyle yeniden oluşturdum. WCF arayüzü:

[XmlSerializerFormat] 
[ServiceContract(Namespace = "urn:outer-namespace")] 
public interface IService1 
{ 
    [OperationContract] 
    MyClass DoStuff(int value); 
} 

[Serializable] 
public class MyClass 
{ 
    [XmlElement(ElementName = "DataString")] 
    public string MyString { get; set; } 
} 

web hizmeti uygulaması:

bu webcoder bir yanıt daha sonra da seri hale
public class Service1 : IService1 
{ 
    public MyClass DoStuff(int value) 
    { 
     return new MyClass { MyString = "Wooh!" }; 
    } 
} 

: Biz (belirtilmemesi SABUN şeyler)

<DoStuffResponse xmlns="urn:outer-namespace"> 
    <DoStuffResult> 
     <DataString>Wooh!</DataString> 
    </DoStuffResult> 
    </DoStuffResponse> 

Ama istiyorum <DoStuffResult>, xmlns = "urn: iç isim-alanı" olacaktır.

Arabirim işlevinde veya web hizmeti işlevinde [return: XmlElement (...)] eklemeyi denedim, ancak bu işlem gerçekleşmiyor. Ayrıca MyClass sınıf tanımında bir [XmlType] veya [XmlRoot] çalışmıyor.

WCF web hizmeti işlevinin dönüş değeri olan nesnenin seri hale getirilmiş XML ad alanını (veya öğe adını) nasıl değiştireceği konusunda bir fikri olan var mı?

cevap

3

XML Serileştirme (veya daha iyisi) Veri Sözleşmesi tanımı öznitelikleriyle ad alanlarını tanımlayın.

örn. XML Serileştirme ile:

örn. Veri Sözleşme serileştirme ile: arzu, mesajın etrafında SABUN sargı üzerinde ad değil ayarlamaktır çünkü

[DataContract(Namespace="http://example.com/eg2")] 
public class MyClass { 
    [DataMember] 
    public string MyString { get; set; } 
} 

DÜZENLEME

ilk açıklama dayanarak, yukarıda, işe yaramaz Mesajın kendisi üzerinde.

OperationContractAttribute ad alanı denetimi içermez ve başka bir WCF özniteliğini bir yöntem düzeyinde göremiyorum.

İki olasılık: (1) Bir soyutlama seviyesini düşürerek ve bir İleti Sözleşmesi kullanarak yeterli kontrole sahip olabilirsiniz. (2) Hizmet için geçerli WSDL'yi (svcutil.exe kullanarak), istediğiniz ad alanlarını elde etmek için el ile ayarlamayı ve ardından kodu oluşturmak için svcutil.exe kodunu tekrar kullanarak alın ve sonuçta ortaya çıkan koda bakın.

+0

Zaten söz belirtildiği gibi, ben bir XmlRoot özellik ekleyerek denedim ve işe yaramadı. Ad alanını yalnızca MyClass içindeki alanlara ekler, ancak MyClass'ın kendisine eklemez. DataContract da çalışmıyor ve yeniden adlandırmak ve sipariş vermek için XmlSerializer'ı tercih ederim. –

+0

svcutil kullandım, ancak bir serializer belirtmeden ve MessageContract ve ServiceContract ile XmlSerializer birleşimini oluşturdu. Yani bir ya da iki sarmalayıcı var ve ben hepsini çalıştırmak için XML öznitelikleri kullanmaya devam edebilirim. –

1

Günlerce arama yaptıktan ve düzinelerce önerilen çözümü denedikten sonra; Son olarak, WBF'yi, web hizmet yönteminin adına Result ekleyeceği bir sarıcı kapsayıcı adını zorlamayı bırakabiliyordum. hile web hizmeti arayüzüne aşağıdaki dekoratör özelliği eklemelerini oldu:

[return:MessageParameter(Name = "whatIWantItNamed")] 

Bu nitelik arayüzünde doğrudan [OperationContract] niteliğinden sonra (ve sadece gerçek yöntem saplama öncesi) bulunan/yerleştirilmelidir.

(Ben de ServiceContract ve OperationContract niteliklerin tümüne bir XmlSerializerFormat öznitelik eklemek gerekiyordu.)

İlgili konular