Servis Referans Hatası: Servis referansı için kod üretilemedi


131

Bir Windows Servis Çözümüm var ve VS2010'da bir Hermes (Açık Kaynak ebms mesaj sunucusu) Web Servisine bir servis referansı eklemeye çalışıyorum.

Web Hizmetini URL'sini kullanarak bulabilirim, ancak Hizmet referansını denediğimde ve doldurduğumda Visual Studio'da aşağıdaki hataları alıyorum:

Error 8 Custom tool error: Failed to generate code for the service reference 'testService'.  Please check other error and warning messages for details. C:\Users\Admin\documents\visual studio 2010\Projects\MyProject\MyProject.MessageHandler\Service References\testService\Reference.svcmap 1 1 MyProject.MessageHandler


Warning 6 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://service.ebms.edi.cecid.hku.hk/']/wsdl:portType[@name='EbmsStatusQuery']
XPath to Error Source: //wsdl:definitions[@targetNamespace='http://service.ebms.edi.cecid.hku.hk/']/wsdl:binding[@name='EbmsSoapHttpStatusQuery'] C:\Users\Admin\documents\visual studio 2010\Projects\MyProject\MyProject.MessageHandler\Service References\testService\Reference.svcmap 1 1 MyProject.MessageHandler

Warning 7 Custom tool warning: Cannot import wsdl:port
Detail: There was an error importing a wsdl:binding that the wsdl:port is dependent on.
XPath to wsdl:binding: //wsdl:definitions[@targetNamespace='http://service.ebms.edi.cecid.hku.hk/']/wsdl:binding[@name='EbmsSoapHttpStatusQuery']
XPath to Error Source: //wsdl:definitions[@targetNamespace='http://service.ebms.edi.cecid.hku.hk/']/wsdl:service[@name='EbmsMessageStatusQuery']/wsdl:port[@name='EbmsStatusQuery'] C:\Users\Admin\documents\visual studio 2010\Projects\MyProject\MyProject.MessageHandler\Service References\testService\Reference.svcmap 1 1 MyProject.MessageHandler

Warning 5 Custom tool warning: Cannot import wsdl:portType
Detail: An exception was thrown while running a WSDL import extension: System.ServiceModel.Description.XmlSerializerMessageContractImporter
Error: Schema with target namespace 'http://service.ebms.edi.cecid.hku.hk/' could not be found.
XPath to Error Source: //wsdl:definitions[@targetNamespace='http://service.ebms.edi.cecid.hku.hk/']/wsdl:portType[@name='EbmsStatusQuery'] C:\Users\Admin\documents\visual studio 2010\Projects\MyProject\MyProject.MessageHandler\Service References\testService\Reference.svcmap 1 1 MyProject.MessageHandler

Bazı araştırmalar, svcutil.exe'nin bir dizine (muhtemelen c: \ windows \ temp) izinleri olmadığı için proxy'leri oluşturamamasından kaynaklanıyor gibi görünüyordu. Çeşitli erişim izinleri atamayı denedim, ancak hangi kullanıcının izne ihtiyacı olduğundan veya bunun sadece bir kırmızı ringa olup olmadığından emin değilim.

Herhangi bir fikir çok takdir edilecektir.

Teşekkürler

Yanıtlar:


303

Hizmet referansını yapılandır seçeneğinden tüm başvurulan derlemelerde Yeniden kullanım türlerinin işaretini kaldırmanız gerekir

Ayrıntılar için bunu kontrol edin


3
Alternatif olarak, "Başvurulan derlemelerde türleri yeniden kullanma" gerçekten gerekli olduğunda, hizmet başvurusunu bu amaç için özel olarak oluşturulmuş bir Sınıf Kitaplığı projesinden ekleyebilirsiniz. Ek bilgi için cevabımı kontrol edin .
Florin Dumitrescu

"Yeniden kullanım türleri" seçeneğinin işaretini kaldırmadan bir çözüm istedim ve işe yarayan bir çözüm bulmayı başardım, cevabıma buradan bakın .
Shahin Dohan

Bunun gibi bir şey yapmak yerine, referans verilenlerin tümünü körü körüne kullanmak yerine WCF istemcisinin bağlı olduğu derlemeleri kullanın, söz konusu onay kutusunun işaretini kaldırmaktan daha zor ve daha fazla zaman alıcı olabilir, ancak bu çözümü birinden daha uygun buluyorum yanıt olarak işaretlendi.
Oscar Guillamon

Ayrıca Projenizin Salt Okunur olmadığından emin olun..Bu benim
sorunumdu

126

Servis referansınıza sağ tıklayın ve seçin Configure Service Reference...

Servis Referansını Yapılandırın

Ardından işaretini kaldırın Reuse types in referenced assemblies

Yeniden Kullanım Türleri

OKÇözümünüzü tıklayın , temizleyin ve yeniden oluşturun.


2
Başvurulan derlemeleri yeniden kullanmam gerekirse ne olur? Bir projem var ve bu onay kutusu işaretlendi. Güncelleme benim makinemde çalışıyor, ama bir iş arkadaşımın makinesinde yok ... herhangi bir ipucu?
Ricardo Appleton

Bu, projemle v4.6.1'den v4.7'ye yükselttiğimde oldu. Bu onu düzeltti.
Mike Flynn

17

Ayrıca, Visual Studio 2012 kullanarak bir ASP .Net MVC 4.0 projesinden bir web hizmeti için istemci oluşturmaya çalışırken benzer bir hatayla karşılaştım.

Sorunun kökü, müşteriyi oluşturmaya çalıştığım projenin, aynı zamanda referansta bulunulmayan başka bir montaja bağımlı olan bir montaja referansta bulunması gerçeği gibi görünüyor.

Servis konfigürasyonunda "Referans verilen montajlarda yeniden kullanım tipleri" etkinleştirildiğinde, servis oluşturucu muhtemelen yeniden kullanılabilecek tiplerin bir listesini almak için referans verilen tüm montajları inceliyordur. Referans verilen montajlardan birinin mevcut olmayan başka bir montaja referans veriyor olması, muhtemelen jeneratörün arızalanmasına neden oluyor.

Hizmet yapılandırmalarından "Referans derlemelerde yeniden kullanım türleri" seçeneğinin işaretinin kaldırılması yukarıdaki sorunu çözecektir , ancak bunun bir yan etkisi vardır. Yeniden kullanım türleri seçeneğinin bir nedeni vardır ve bazı durumlarda hizmeti tüketen kodda gereksiz döküm yapılmasını önler.

Örneğin, hizmetin kendisi WCF kullanılarak oluşturulmuşsa ve içindeki bazı yöntem parametreleri System.Guid türündeyse, yeniden kullanım türleri seçeneği devre dışı bırakılırsa bunlar oluşturulan istemcideki dizelere dönüştürülecektir.

Türleri yeniden kullanmayı devre dışı bırakmayı tercih ettiğim bir alternatif , hizmet referansını bu amaç için özel olarak oluşturulmuş Sınıf Kitaplığı projesinden eklemektir. Unutulmaması gereken tek şey, hizmetle ilgili tüm yapılandırmaları sınıf kitaplığının app.config dosyasından başlangıç ​​projesinin yapılandırma dosyasına kopyalamaktır.

Yerel derlemelerde tanımlı ve hizmet istemcisinde yeniden kullanılması gereken türler varsa, bu derlemelere tüm bağımlılıkları ile birlikte yukarıda belirtilen sınıf kitaplığı projesinden başvurulması yeterlidir.


Tuhaf. Bağlamamı HttpBinding'den NetNamedPipeBinding'e değiştirdim (ayrıca bir mex uç noktası ekledim) ve bunu istemci derlemem A'da kodladım. WCF hizmetime başvuran yeni bir sınıf kitaplığı B oluşturdum. Sonra B'yi A'ya referans olarak ekledim ve sihirli bir şekilde her şey yeniden çalışıyor. Çok ilginç. Çözüm için teşekkürler
citronas


1

WSDL'deki bir hatadan kaynaklandığı ve WSDL'yi incelemeden sorunu tahmin etmek son derece zor olurdu , daha fazla yorum yapamam. Yani WSDL'nizi paylaşabiliyorsanız, lütfen paylaşın.

Söyleyebileceğim tek şey, WSDL'de ('http://service.ebms.edi.cecid.hku.hk/' hedef ad alanıyla) eksik bir şema olduğu. Ekleme talimatları göz ardı edildiğinde sorunlar ve şemanın farklı şekilde ele alınması hakkında bilgi sahibiyim.

Genel olarak Microsoft'un web hizmetleri uygulamasını oldukça iyi buldum, bu yüzden web hizmetinin tehlikeli WSDL gönderdiğini düşünüyorum.


Teşekkürler Aliostad, işten geldiğimde WSDL'yi paylaşmaya çalışacağım.
jheppinstall

0

Silverlight 5'te (VS2012) aynı hatayı alıyorum

Ayrıca aşağıdaki referansları kaldırabilirsiniz:

  • System.ServiceModel.DomainServices.Client
  • System.ServiceModel.DomainServices.Client.Web

Hizmet referanslarını güncelledikten sonra tekrar eklediğinizden emin olun.


0

Yukarıda belirtildiği gibi, olası birkaç farklı sorun vardır. Bulduğumuz şey, WCF kitaplığı için .DLL'nin istemci projesine bir referans olarak eklenmiş olmasıdır. Bu da, nesnelerin çözülmesinde sorunlar yarattı ve böylece dosyaların kod oluşturma adımlarıyla "boşaltılmasına" neden oldu. "Yeniden Kullanım Türleri ..." kullanımının işaretinin kaldırılması bir cevap gibi görünebilirken, yeni bir ad alanında gerçek türlere vekil olan nesne türlerinin ekstra tanımlarını oluşturur ve bu daha sonra her tür "uyumluluk" sorununa neden olur. bu türlerin kullanımı. Sadece bir türü gerçekten "gizlemek" istiyorsanız, bu seçeneği işaretlemelisiniz.

Bir "DLL" türü bağımlılığının, diğerinden ayrı tutmaya çalıştığınız bir projeye "sızmasını" istemediğinizde, türü gizlemek uygun olacaktır. WCF kitaplığı projesinin DLL dosyası istemci proje başvurularına girerse, tür tanımları da DLL'de bulunduğundan, her türlü garip yan etkiyle bu sorunu yaşarsınız.


0

Aynı sorunla karşı karşıya, Visual Studio'nun Yönetici modunda çalıştırılmasıyla çözüldü


0

VS2015 Professional'da bir VS2010 WCF + Silverlight çözümünü yükseltirken bu sorunla karşılaştım . Silverlight 4'ten Silverlight 5'e otomatik olarak yükseltmenin yanı sıra, hizmet referansının yeniden kullanımı onay kutusu değeri değiştirildi ve oluşturma başarısız oldu.


0

Bu hata oluştuğunda her zaman sorun "yeniden kullanım türleri" değildir.

Daha eski bir hizmete referans eklerken, 'gelişmiş'i ve orada' Web Referansı Ekle'yi tıklayın. Şimdi wsdl'nize bağlayın ve her şey çalışıyor olmalı.


0

Montajı yeniden kullan onay kutusunu işaretlemeden bunu düzeltmek istiyorsanız, benim için işe yarayan şey buydu:

  • Yeniden kullanmak istediğiniz referanslı montajı kaldırın
  • Projenin tüm bin klasörünü silin
  • Hizmet referansını güncelleyin
    • "Belirtilen başvurulan derlemelerde türleri yeniden kullanma" yı koruyun
  • Hataları düzeltmek için montaja tekrar referans ekleyin
  • Servis referansını tekrar güncelleyin

0

Visual Studio'yu yeniden başlatmak benim için hile yaptı. VS 2015 kullanıyorum.


-1

Servis referansımı güncellemeye çalışırken bu problemi yaşadım (Hata yalnızca bir servis referansı eklerken ortaya çıkıyor) ancak montajın yeniden kullanımı onay kutusunu kaldırmak istemedim.

Benim için işe yarayan şuydu:

  • Yeniden kullanmak istediğim referanslı derlemeyi kaldır
  • Hizmet referansını güncelleyin
  • "Belirtilen başvurulan derlemelerde türleri yeniden kullanma" yı koruyun
  • Hataları görmezden gelin, çünkü referans eksiktir!
  • Hataları düzeltmek için montaja tekrar referans ekleyin
  • Servis referansını tekrar güncelleyin

Voila, şimdi aslında güncelleniyor ve artık üretilen kodumun tamamını kaldırmaya çalışmıyor.

Yeniden kullanım türleri özelliğinden vazgeçmeye neredeyse hazırdım ...

DÜZENLEME: Ayrıca, svcutil x64 ile hatalı olduğundan, yapı yapılandırmasının AnyCPU veya x86 olduğundan emin olun.

Olumsuz oy verene: Sizin için işe yaramadıysa özür dilerim, neden benim için işe yaradığını bile bilmiyorum ama işe yaradı. O zamanlar sorunu çözen başka bir şey yapmış olabilirim, ama şimdi bilmem mümkün değil.

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.