2013-04-23 32 views
9

Paylaşılan türlerle birlikte WSDL'lerden proxy'lerin oluşturulmasına bir örnek bulmuyorum, ancak bunlarla birlikte herhangi bir XSD'ye sahip olmak yok. Herkes bunu bir örnek olarak işaretleyebilir ve bana örnek olarak gösterebilir mi lütfen?WSDL türlerini XSD olmadan paylaşma

Burada, her birinin kendi ad alanı ve ortak türü olan 2 hizmet vardır. Halka açık bir şekilde erişilebilen tek şey, kendi WSDL'leridir, XSD'nin ya da .dll dosyasının wsdl.exe /sharedtypes ya da svcutils'a geçmesi ve onun olmadan da ve class Foo1 numaralarına geçemediğim aynı class Foo ile sona erer.

Ben programlı vekiller üreten ve DataContract/WebServiceBinding ad alanlarını göz ardı ederek CodeDOM aracılığıyla çiftleri algıladığını ile gelen en iyi, ama bu çok büyük bir karmaşa ...

Bunu yapmanın bir yolu yoktur
[WebService(Namespace = "http://tempuri.org/FOO1")] 
public class Service1 : WebService 
{ 
    [WebMethod] 
    public Foo GetFoo() 
    { 
     return new Foo(); 
    } 
} 

[WebService(Namespace = "http://tempuri.org/FOO2")] 
public class Service2 : WebService 
{ 
    [WebMethod] 
    public void SetFoo(Foo foo) 
    { 
    } 
} 

public class Foo 
{ 
    public int Bar { get; set; } 
} 
+0

WSDL tanımlarının bir kısmı, türleri tanımlayan XSD'lerdir. WSDL'de tanımlanmamışlarsa hizmeti nasıl tüketmeniz gerekiyor? –

+0

@hugh Her bir WSDL'de iki kez tanımlandılar, yani 'Service1' ve 'Service2' wsdls' 'GetFoo'dan' 'geçebilen ortak' Foo 'tanımına sahip proxy'leri üretmek için bir yol göremiyorum. SetFoo'. –

+0

Anladım. Aşağıdaki cevabıma bakın –

cevap

1

, here özetlenmiştir.

Sizin durumunuzda, ilk adımı atlayabilir, hizmet 1'den proxy'yi oluşturabilir ve sonra servisinizi oluştururken servis 1 proxy kurulumuna başvurmak için svcutil üzerindeki/r işaretini kullanabilirsiniz.

Bu, hizmetinizin 2 vekilinin, hizmetinizdeki 1 vekilden aynı Foo örneğini kullanmasını sağlayacaktır.

Ancak, yalnızca iki işlemle tek bir hizmeti barındırmayı düşündünüz mü? Çok fazla iş kurtaracak.

Düzenleme: Ayrıca, bu yazı bir göz vardır: http://blogs.msdn.com/b/youssefm/archive/2009/10/09/reusing-types-in-referenced-assemblies-with-svcutil-s-r-switch.aspx

+0

Çalışmıyor gibi gözüküyor, 2 Foo'yu 2 farklı isim alanında saklıyor. İşte kurulum (https://github.com/kozhevnikov/WebService1) - iki hizmet ile bir 'WebService1', paylaşılan' Foo' türünde bir 'ClassLibrary1' ve' GetFoo'/'çağrısında bulunan bir ConsoleApplication1' Proxy üzerinden SetFoo'. Service1.wsdl && csc/t: library Service1.cs && svcutil Service2.wsdl/r: Service1.dll ve svcutil Service1.wsdl/r: .. \ ClassLibrary1 \ bin \ Debug \ ClassLibrary1.dll işlevini svcutil denedim ama her iki durumda da 2 uyumsuz Foo'lar ile sonuçlanır. –

+0

WSDL'leri yükleyebilir misiniz ve bir göz atabilir miyim? Bu iki Foo'nun gerçekten farklı XSD'ler içinde tanımlanmış ayrı türler olabilir, bu durumda/r bayrağını kullanamazsınız, çünkü türler gerçekten eşdeğer değildir. –

+0

Tam olarak, aynı sınıftan geliyorlar ama teknik olarak farklı nedenler farklıdır autogenerated wsdl, iki kopyayı iki farklı ad alanı (kullanıldıkları ana web hizmetleri) altına alır. Örnek wsdls https: // github'dedir.com/kozhevnikov/WebService1/tree/master/wsdl –

1

Öncelikle, tüm ortak hizmet veri türleri için [("Burada bazı ad" Namespace =) DataContract] ayarlamanız gerekir aksi olduğunda WSDL ve XSD'ler oluşturulduktan sonra iki fark ad alanından nesneleriniz olacak --- bu kesinlikle esastır. Ad alanı değeri yalnızca WSDL'de değil, XSD'de tanımlanan türlere uygulanır. XSD = veri, WSDL = hizmet.

XSD ve WSDL ve yalnızca META hizmet davranışı kümesine sahipseniz ve ancak bu davranışı eklediyseniz ve sonra URL'ye gidebiliyorsanız oluşturulur. META hizmet davranışının URL'sinin, WSDL ve XSD'leriniz için bir bağlantısı olacaktır.

Aşağıdaki prensipleri, IIS üzerinden değil, windows hizmetlerinde self-host hizmetleri için kullanıyorum, ancak aynı ilkeler geçerlidir ....

/// <summary> 
/// Enables meta data output for a service host. 
/// </summary> 
/// <param name="host">The service host.</param> 
/// <remarks>Must be invoked prior to starting the service host.</remarks> 
public static void SetupMetaDataBehaviour(ServiceHost host) 
{ 
    ServiceMetadataBehavior metaDataBehaviour = host.Description.Behaviors.Find<ServiceMetadataBehavior>(); 
    if (metaDataBehaviour == null) 
    { 
     metaDataBehaviour = new ServiceMetadataBehavior(); 
     metaDataBehaviour.HttpGetEnabled = true; 
     host.Description.Behaviors.Add(metaDataBehaviour); 
    } 
    else 
    { 
     metaDataBehaviour.HttpGetEnabled = true; 
    } 
} 
+0

Teşekkürler, ancak OP'ye göre hizmetleri veya türleri değiştiremiyorum, sadece ham autogenerated WSDL'lere erişimleri varmış gibi (teknik olarak ben WSDL'leri kendim ürettiğim türleri yansıttım)), hizmetlerin kendilerine özgü [WebService (Ad Alanı)] vardır ve aralarında XmlInclude, hizmet veya ad alanıyla ilgili öznitelikler dışında türler üzerinde hiçbir şey yoktur. –

+0

"GetFoo"/"SetFoo" örneğinde olduğu gibi, "Service1" ve "Service2" için WSDL'lerim var ve onlar için "Foo" ile proxy oluşturmam gerekiyor, böylece GetFoo'yu çağırabilir ve 'SetFoo'ya iletebilirim farklı otomatik olarak adlandırılmış ad alanı altında (CodeDOM ile çalışıyorum, Foo'yu ayıkladığınızda ve herhangi bir ad alanını bıraktığımda çalışır, ancak bu yaklaşım yüzlerce belirsiz eski web hizmetine ölçeklenmez). –

1

senin iki web başvuruları ekledikten sonra:

    nesne tarayıcıda ikinci web hizmeti referansı
  1. üzerinde
  2. çift tıklama sağ Foo tıklayın ve seçim
  3. Foo
  4. tanımına gidin tanımıma git
  5. sınıf tanımını Foo için silme
  6. ağlar için ad kullanmanın ifadesini ekleyin o Otomatik oluşturulan kod zorlar hem hizmet referanslar aynı sınıf beyanı kullanmak için ervice bir
  7. find ve sadece Foo

Bu ile <namespace-of-service-reference-2>.Foo tüm örneklerini değiştirmek sorununuzu çözecektir.

+1

Teşekkürler, ancak post-generation CodeDOM manipülasyonları ile aynı, sadece manuel. Bunu otomatik olarak veya program aracılığıyla (ör. CodeDOM) yapmanın ve binlerce paylaşılan türle yüzlerce veya eski web hizmetlerine ölçeklendirmenin bir yolunu arıyorum. –

+0

Ne yapmak istediğini anlıyorum. Fakat görsel stüdyo, sadece wsdl dosyasını kullanarak farklı ad alanlarındaki iki sınıfı otomatik olarak oluşturduğundan, bunu alamayacaksınız. Çözümüm, büyük bir projede değişiklik yapmak için yaklaşık 5 dakika sürüyor. Tekrarlanabilir ve hatırlanması kolaydır. –

+0

Ayrıca, bu ortak bir senaryo değildir. Özellikle "yüzlerce veya eski web hizmetleri" olan bir ortamda, bu soruna bir kez, yüzlerce üçüncü parti API'sı ile girebilirsiniz. İç kod ise, bu şekilde yazmayın. Eğer çekimleri yapan kişi siz değilseniz ve birisi bu şekilde hizmetleri mimarıyorsa, oturmanız ve bu tasarımın neden olduğu hayal kırıklığı düzeyini göstermeniz gerekir. –