Bu WCF hatası ne anlama geliyor: "Özel araç uyarısı: wsdl: portType içe aktarılamıyor"


85

Çözümümde bir WCF hizmet kitaplığı projesi oluşturdum ve buna hizmet referanslarım var. Hizmetleri bir sınıf kitaplığından kullanıyorum, bu nedenle sınıf kitaplığına ek olarak WPF uygulama projemden de referanslarım var. Hizmetler doğrudan kurulur - yalnızca eşzamansız hizmet işlevlerini almak için değiştirilir.

Hizmet referanslarımı güncellemek isteyene kadar her şey yolunda gidiyordu. Başarısız oldu, bu yüzden sonunda geri döndüm ve yeniden denedim, ancak o zaman bile başarısız oldu! Bu nedenle, herhangi bir değişiklik yapılmadan servis referanslarının güncellenmesi başarısız olur. Neden?!

Aldığım hata şudur:

Custom tool error: Failed to generate code for the service reference 
'MyServiceReference'.  Please check other error and warning messages for details.   

Uyarı daha fazla bilgi verir:

Custom tool warning: Cannot import wsdl:portType
Detail: An exception was thrown while running a WSDL import extension: 
System.ServiceModel.Description.DataContractSerializerMessageContractImporter
Error: List of referenced types contains more than one type with data contract name 'Patient' in  
namespace 'http://schemas.datacontract.org/2004/07/MyApp.Model'. Need to exclude all but one of the 
following types. Only matching types can be valid references: 
"MyApp.Dashboard.MyServiceReference.Patient, Medski.Dashboard, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" (matching)
"MyApp.Model.Patient, MyApp.Model, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" (matching)
XPath to Error Source: //wsdl:definitions[@targetNamespace='http://tempuri.org/']/wsdl:portType[@name='ISomeService']

Aynı şekilde iki benzer uyarı da var:

Custom tool warning: Cannot import wsdl:binding
Detail: There was an error importing a wsdl:portType that the wsdl:binding is dependent on.
XPath to wsdl:portType: //wsdl:definitions[@targetNamespace='http://tempuri.org/']/wsdl:portType[@name='ISomeService']
XPath to Error Source: //wsdl:definitions[@targetNamespace='http://tempuri.org/']/wsdl:binding[@name='WSHttpBinding_ISomeService']  

Ve aynısı:

Custom tool warning: Cannot import wsdl:port .. 

Tüm bunları kafa karıştırıcı buluyorum .. Müşteri tarafındaki Dashboard'da, servis referansından aldığım dışında bir Hasta sınıfım yok. Yani bunun anlamı nedir? Ve neden birdenbire ortaya çıkıyor? Unutma: Ben hiçbir şeyi değiştirmedim!

Şimdi, bunun çözümü burada bulundu , ancak bunun ne anlama geldiğine dair bir açıklama yapılmadı. Yani; Servis için "Servis referansını yapılandır" kısmında "Referans verilen derlemelerde yeniden kullanım tipleri" onay kutusunun işaretini kaldırıyorum. Şimdi yeniden inşa etmek sorunsuz çalışıyor. Ama ben gerçekten neyi değiştirdim? Bu, başvurumu etkileyecek mi? Ve bunun işareti ne zaman kaldırılmalı? DataContract'i kurduğum türleri yeniden kullanmak istiyorum, ancak daha fazlasını istemiyorum. Bu işaretlenmemiş olanlara yine de erişebilecek miyim?


Tamam, msdn'de kısa bir açıklama var ( msdn.microsoft.com/en-us/library/bb628653.aspx ). Ama daha iyi bir açıklaması olan var mı? Bu, DataContract'ın kurduğum anlamına nasıl geliyor?
stiank81

Yanıtlar:


37

Bir hizmet referansı eklediğinizde, hizmet tarafından kullanılan türlerin işlenmesinin iki yolu vardır:

  • Türler bir dll'de saklanır ve bu dll'ye hem istemciden hem de sunucu uygulamasından başvurulur.
  • Türler, istemci tarafından başvurulan bir dll'de değildir. Bu durumda, servis referansını oluşturan araç, referanslar.cs dosyasında türleri oluşturacaktır.

Yanlış gidebilecek birçok şey var. Araç çökerse, servis referansını silip yeniden başlamanın bazen daha hızlı olduğunu bulduk.

Servis referansını kullanmayı bıraktık. Müşteri ve hizmetin kontrolüne sahip olduğumuz projeler için, bu ekran video kaydında açıklanan yöntemi kullanıyoruz .


2
Teşekkürler! Aslında o ekran video kaydını dün buldum. İzledim ve gerçekten bir göz açıcıydı! Temelleri yerine getirdikten sonra bu yapıya geçmeyi planlıyorum. Benim gördüğüm bazı problemlerle boğuşuyormuşsun gibi geliyor. Garip bir şekilde ters giden bir şey olduğunda ve bu iyi bir işaret olmadığında, çoğu zaman hizmet referanslarını silip okuyorum. Açıklanan mimarinin yardımcı olacağını umuyorum!
stiank81

Silverlight 5 ile PollingDuplex Binding kullanırken web hizmetini elle yazabilen var mı?
Richard B

157

Cevabımı burada buldum: http://www.lukepuplett.com/2010/07/note-to-self-don-let-wcf-svcutil-reuse.html

Uzun lafın kısası: Ben işaretli referans meclislerinde Yeniden türleri arasından Gelişmiş menüsünde .


Bunun önemli olup olmadığını bilmiyorum ama MVC değil Web Formları kullanıyorum.


2
VS 2012'nin yeniden başlatılması da gerekli
George Filippakos

İzlemekle ilgileniyorum, ancak bağlantı artık kesildi, lütfen başka bir yerde varsa paylaşın
Chris

1
VS2013 altında bir MVC 3 projesinde çalışır (yeniden başlatma gerekmez).
Pawel Krakowiak

5
+1 - Sadece referans için: Bu değişikliği yapmak için, onu tüketen projede servis referansına sağ tıklayın ve 'Servis Referansını Yapılandır ...' seçeneğini seçin
GrandMasterFlush

2
Hiçbir şey "uzun lafın kısaltması" ndan daha iyi
Ron

10

Bugün de bu sorunu yaşadım. Hatamı bulmam bir günümü aldı. Umarım yardımcı olur.

İçe aktarılamayan sınıfımın cutom enum türü özelliği var. Bu özellik DataMember olarak işaretlenir ve Enum da DataContract olarak işaretlenir. Şimdiye kadar her şey yolunda. Her enum üyesini EnumMember olarak işaretlemeyi unuttum.

Bu yüzden değiştim

[DataContract]
public enum SortMethodType
{
    Default = 0,
    Popularity = 1,
    ReleaseDate = 2,
    PublishedDate = 3,
    TranslatedTitle = 4,
    OriginalTitle = 5,
    UserRating = 6,
    Duration = 7
}

Buna:

[DataContract]
public enum SortMethodType
{
    [EnumMember]
    Default = 0,
    [EnumMember]
    Popularity = 1,
    [EnumMember]
    ReleaseDate = 2,
    [EnumMember]
    PublishedDate = 3,
    [EnumMember]
    TranslatedTitle = 4,
    [EnumMember]
    OriginalTitle = 5,
    [EnumMember]
    UserRating = 6,
    [EnumMember]
    Duration = 7
}

Ve sonunda işe yaradı!


8

Referans eklerken Gelişmiş özelliklere gidin ve kontrol listesinden "System.Window.Browser" öğesini kaldırın, Sorunu çözer.


Teşekkür! Artık Servis Referanslarını kullanmamak - ekran yayınında @Shiraz tarafından verilen yanıttan açıklanan manuel yaklaşımı uygulamak. Ama bunu bilmek güzel!
stiank81

8

bu kulağa garip gelebilir, ancak referansları silerek, ardından Visual Studio'yu kapatarak ve yeniden açarak ve sonunda referansları tekrar ekleyerek sorunu çözdüm.

Bence özel araç şeyinin yeniden başlatılması gerekiyordu.


2
Referansı SİLMEDEN sorunu çözmeye kararlı olsanız bile YENİ bir PROJE oluşturmanızı ve çalışıp çalışmadığını görmek için referansı eklemenizi şiddetle tavsiye ederim. bu mevcut projenizde görmediğiniz bir hatayı ortaya çıkarabilir veya sadece işe yarayabilir
Simon_Weaver

4

Başka bir geliştirici makinesinde çalışırken bu hatayla sürekli karşılaşıyorum. Sanal makinemin her yerinde tam bir yönetici olsam da, Visual Studio'yu kapatmayı ve 'Yönetici Olarak Çalıştır' ile yeniden açmayı denedim ve sihirli bir şekilde çalıştı.

İyi şanslar.


2

Çözümümü Visual Studio (VS) 2010'dan 2013'e yükselttikten ve her projenin .NET Framework'ü 4'ten 4.5.1'e değiştirdikten sonra uyarı aldım. VS'yi kapattım ve yeniden açtım ve uyarılar kayboldu.


Bu bana yardımcı oldu, ancak ben .NET 4.5.2'den 4.6 Gaa!
Jimenemex

1

'Başvurulan derlemelerde yeniden kullanım türlerini' kapatmanın bir dezavantajı, belirsiz referanslarla ilgili sorunlara neden olabilmesidir. Bunun nedeni, bu nesneleri referans .cs dosyasında yeniden oluşturan hizmet referansından kaynaklanmaktadır ve hizmeti uygulayan kodunuz, onlara orijinal ad alanından başvuruyor olabilir.

Bu senaryo gerçekleştiğinde, yalnızca belirsiz referanslara sahip olanları seçmeme izin veren ve sorunu bu şekilde hızla çözen 'belirtilen referanslı derlemelerde yeniden kullanım türlerini' kontrol etmeyi yararlı buluyorum.

Umarım başkasına yardımcı olur.


0

WCF hizmetinin arabirimlerim bir derlemede, uygulama başka bir derlemede ve hizmet başvurusu yine başka bir derlemede, hizmet başvurusunun istemcilerinden ayrı. DataContract'ı bir numaralandırmaya uyguladıktan hemen sonra hata mesajını aldım. EnumMember'ı numaralandırma alanlarına uyguladıktan sonra sorun çözüldü.


0

Hizmetinizin herhangi bir sorunu olmadığından şüpheniz varsa (numaralandırmalarla ilgili sorunlar veya başkaları tarafından belirtildiği gibi serileştirilemeyen sınıflar gibi), o zaman yeni bir referansla yeni bir proje oluşturmaya çalışın .

Silverlight 5 kullanıyorum ve referansı birkaç kez silmeyi ve yeniden oluşturmayı denedim. reference.csDosya sadece tamamen geldi her zaman boşaltın ve ben hizmetinde değişmişti ne olduğunu anlamaya çalışırken söz konusu olmamakla öyle yaratılmış etmişti yana anlamıyla yıl olmuştu.

Hatanın 2.0.5.0'a başvurular içerdiğini fark ettim. Şimdi bunun Silverlight sürümüyle gerçekten alakalı olup olmadığını bile bilmiyorum, ama bana sadece yepyeni bir proje yaratmayı düşündürdü ve sonra aniden her şey çalıştı.

Uyarı 2 Özel araç uyarısı: wsdl: portType ayrıntısı alınamıyor: WSDL içe aktarma uzantısı çalıştırılırken bir istisna atıldı: System.ServiceModel.Description.DataContractSerializerMessageContractImporter Hatası: Dosya veya derleme yüklenemedi 'System.Xml, Version = 2.0.5.0, Kültür = nötr, PublicKeyToken = 7cec85d7bea7798e 'veya bağımlılıklarından biri. Sistem belirtilen dosyayı bulamıyor. Hata Kaynağına XPath: // wsdl: definitions [@targetNamespace = ''] / wsdl: port Türü [@ name = 'IShoppingCart']


0

Projeme bakıyordum ve aynı sorunu yaşıyordum. WCF'ye karşı Web Sitesinde aynı DLL'nin farklı sürümleri olduğu ortaya çıktı. Web sitesinde DLL'nin daha yeni bir sürümü vardı ve hizmet DLL'nin daha eski bir sürümüne başvuruyordu. Hepsi senkronize olduktan sonra hepsi iyi çalıştı.


0

Ben de aynı hatayı yaşadım. Neyin yanlış gittiğini anlamaya çalışırken neredeyse bir gün uğraştım. Benim için ipucu, VS'nin attığı uyarılardı. Birkaç gün önce eklediğim ve çıkardığım (kullanmamaya karar verdiğim için) bir kütüphane olan Yahoo.Yui.Compressor.dll ile bir tür eşleştirme yapmaya çalışıyordu. Şok ediciydi çünkü kütüphane orada değildi, ama bir şekilde ona referans vermeye çalışıyordu.

Son olarak, bu dll'yi Çöp Kutusu'ndan geri yükledim ve ardından hizmet referansımı başarıyla güncelleyebildim.


0

Gelecekte burada olan herkes için aynı hatayı yaşadım, ancak sürüm sorunlarından iki farklı şekilde yol açtım.

Hizmet referansları aracılığıyla konuşan iki WCF hizmetim ve iki istemci uygulamam var. Her iki tarafta bir nuget paketini güncelledim ve servis referansını güncellemeye çalıştım ve bu hatayı aldım.

Silme yardımcı olmadı. "Derlemeleri yeniden kullan" seçeneğinin işaretini kaldırmak, onları yeniden kullanmam gerektiğinden istenmiyor - bütün mesele bu.

Sonunda iki ayrı mesele vardı:

1) İlk sayının görsel stüdyo önbelleğe alma sorunu olduğuna inanıyorum. Tüm referansları titizlikle gözden geçirdim ve hiçbir sorun bulamadım, ancak yine de dosyanın önceki sürümünü bulamadığımı bildirdi. Tüm nuget paketlerini kaldırdım, görsel stüdyoyu yeniden başlattım ve yeniden yükledim. Servis referansının güncellenmesi işe yaradı.

2) İkinci sorun bir bağımlılık sorunundan kaynaklanıyordu. NuGet paketini her iki tarafta da güncelledim ve her şey doğru görünüyordu, ancak işaretlenmemiş bir bağımlılık senkronize olmadı. Misal:

Paket Foo v1 referansları Bar v1. Foo ve Bar'ı referansı güncellemeden bağımsız olarak v2'ye güncellemek mümkündür. Hem Foo hem de Bar v2'yi kurarsanız, servis referans aracı Foo v2'yi tarayacak, Bar v1 referansına bakacak ve eski sürümü bulamadığı için başarısız olacaktır. Bu, yalnızca her paket için dll'nizin sürüm numaralarını güncellerseniz doğru şekilde raporlanır. Visual Studio ve MSBuild, uygulamayı oluşturmada sorun yaşamaz, ancak hizmet referansı her şeyi çözmeye çalışırken korkunç bir zaman geçirir.

Umarım bu birine yardımcı olur.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.