Co oznacza ten błąd WCF: „Ostrzeżenie dotyczące narzędzia niestandardowego: nie można zaimportować wsdl: portType”

84

Utworzyłem projekt biblioteki usług WCF w moim rozwiązaniu i mam odwołania do usług do tego. Korzystam z usług z biblioteki klas, więc oprócz biblioteki klas mam odwołania z mojego projektu aplikacji WPF. Usługi są konfigurowane prosto do przodu - zmieniane tylko w celu uzyskania funkcji usługi asynchronicznej.

Wszystko działało dobrze - dopóki nie chciałem zaktualizować referencji usług. Nie udało się, więc w końcu wycofałem się i spróbowałem, ale nawet wtedy się nie udało! A więc - aktualizacja odwołań do usług kończy się niepowodzeniem bez wprowadzania jakichkolwiek zmian. Czemu?!

Błąd jaki otrzymuję to ten:

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

Ostrzeżenie zawiera więcej informacji:

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']

Istnieją również dwa podobne ostrzeżenia:

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']  

I to samo dla:

Custom tool warning: Cannot import wsdl:port .. 

Uważam, że to wszystko jest mylące ... Nie mam klasy pacjenta na pulpicie nawigacyjnym po stronie klienta, z wyjątkiem tej, którą otrzymałem za pośrednictwem numeru referencyjnego usługi. Więc co to znaczy? I dlaczego nagle się pojawia? Pamiętaj: ja nawet niczego nie zmieniłem!

Teraz rozwiązanie to zostało znalezione tutaj , ale bez wyjaśnienia, co to oznacza. Więc; w „Konfiguruj odwołanie do usługi” dla usługi odznaczam pole wyboru „Ponownie używaj typów w przywoływanych zestawach”. Przebudowa teraz wszystko działa dobrze bez problemów. Ale co tak naprawdę zmieniłem? Czy będzie to miało wpływ na moją aplikację? A kiedy należy to odznaczyć? Chcę ponownie użyć typów, dla których skonfigurowałem DataContract, ale nie więcej. Czy nadal będę mieć dostęp do tych bez zaznaczenia tego?

stiank81
źródło
OK, jest krótkie wyjaśnienie dotyczące msdn ( msdn.microsoft.com/en-us/library/bb628653.aspx ). Ale czy ktoś ma lepsze wyjaśnienie? Jak to się odnosi do skonfigurowanej przeze mnie umowy DataContract?
stiank81

Odpowiedzi:

37

Po dodaniu odwołania do usługi istnieją dwa sposoby obsługi typów używanych przez usługę:

  • Typy są przechowywane w bibliotece dll, a do tej biblioteki dll odwołuje się zarówno klient, jak i aplikacja serwera.
  • Typy nie znajdują się w bibliotece dll, do której odwołuje się klient. W takim przypadku narzędzie, które tworzy odwołanie do usługi, utworzy typy w pliku referencje.cs.

Jest wiele rzeczy, które mogą się nie udać. Odkryliśmy, że jeśli narzędzie ulegnie awarii, czasami szybciej można usunąć odwołanie do usługi i zacząć od nowa.

Przestaliśmy używać odniesienia do usługi. W przypadku projektów, w których mamy kontrolę nad klientem i usługą, używamy metody opisanej w tym screencastie .

Shiraz Bhaiji
źródło
2
Dzięki! Właściwie to wczoraj znalazłem ten screencast. Obejrzałem i naprawdę otworzyło oczy! Planuję przenieść się do tej struktury, gdy tylko zdobędę podstawy. Wygląda na to, że zmagałeś się z niektórymi z tych samych problemów, które ja widzę. Zbyt często zdarza mi się usuwać i odczytywać odwołania do usług, gdy coś dziwnie idzie nie tak, a to nie jest dobry znak. Mam nadzieję, że opisana architektura pomoże!
stiank81
Czy ktoś był w stanie ręcznie napisać usługę sieciową, gdy używasz powiązania PollingDuplex z Silverlight 5?
Richard B
157

Znalazłem swoją odpowiedź tutaj: http://www.lukepuplett.com/2010/07/note-to-self-don-let-wcf-svcutil-reuse.html

Krótko mówiąc: odznaczyłem opcję Ponowne użycie typów w zespołach referencyjnych z menu Zaawansowane .


Nie wiem, czy to ma znaczenie, ale nie używam MVC, ale formularzy sieci Web.

Dragos Durlut
źródło
2
Wymagane jest również ponowne uruchomienie VS 2012
George Filippakos
Zainteresowany do obejrzenia, ale link nie działa. Udostępnij, jeśli masz go gdzie indziej
Chris.
1
Działa w projekcie MVC 3 pod VS2013 (nie jest wymagane ponowne uruchomienie).
Paweł Krakowiak
5
+1 - Tylko w celach informacyjnych: aby wprowadzić tę zmianę, kliknij prawym przyciskiem myszy odniesienie do usługi w projekcie, który ją zużywa, i wybierz
``
2
Nie ma nic lepszego niż „długa historia” :)
Ron
9

Miałem też ten problem dzisiaj. Znalezienie błędu zajęło mi cały dzień. Mam nadzieję, że to pomoże.

Moja klasa, której nie udało się zaimportować, ma właściwość typu cutom enum. Ta właściwość jest oznaczona jako DataMember, a Enum jest również oznaczona jako DataContract. Jak dotąd wszystko w porządku. Po prostu zapomniałem oznaczyć każdego członka wyliczenia jako EnumMember.

Więc się zmieniłem

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

Do tego:

[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
}

I w końcu zadziałało!

Aurel
źródło
8

Idź do Właściwości zaawansowane podczas dodawania odwołania i usuń "System.Window.Browser" z listy kontrolnej. To rozwiązuje problem.

Sridhar Subramanian
źródło
Dzięki! Nie korzystam już z referencji do usług - wykonując ręczne podejście opisane w screencastie z odpowiedzi @Shiraz. Ale i tak miło jest wiedzieć!
stiank81
8

to może zabrzmieć dziwnie, ale naprawiłem to, usuwając odwołania, a następnie zamykając program Visual Studio i otwierając go ponownie, a na koniec ponownie dodając odwołania.

Myślę, że trzeba było ponownie uruchomić narzędzie niestandardowe, czy coś.

Ateik
źródło
2
nawet jeśli jesteś zdeterminowany, aby rozwiązać problem BEZ usuwania odniesienia, zdecydowanie zalecam utworzenie NOWEGO PROJEKTU i dodanie odniesienia, aby sprawdzić, czy działa. może to ujawnić błąd, którego nie widzisz w istniejącym projekcie lub może po prostu działać
Simon_Weaver
4

Ciągle napotykam ten błąd, gdy działa na innym komputerze dewelopera. Mimo że jestem pełnoprawnym administratorem na całej mojej maszynie wirtualnej, próbowałem zamknąć program Visual Studio i ponownie otworzyć za pomocą opcji „Uruchom jako administrator” i magicznie zadziałało.

Powodzenia.

Tim Gabrhel
źródło
2

Otrzymałem ostrzeżenie po uaktualnieniu mojego rozwiązania z programu Visual Studio (VS) 2010 do 2013 i zmianie programu .NET Framework każdego projektu z 4 na 4.5.1. Zamknąłem VS i ponownie otworzyłem, a ostrzeżenia zniknęły.

Paul Berglund
źródło
Pomogło mi to, ale zmieniłem z .NET 4.5.2 na 4.6 Gaa!
Jimenemex
1

Jedną z wad wyłączenia „ponownego użycia typów w zestawach, do których istnieją odwołania” jest to, że może to powodować problemy z niejednoznacznymi odwołaniami. Jest to spowodowane tym, że odwołanie do usługi ponownie tworzy te obiekty w pliku .cs odniesienia, a kod implementujący usługę może odwoływać się do nich z oryginalnej przestrzeni nazw.

Gdy wystąpi taki scenariusz, uważam za przydatne sprawdzenie `` ponownego użycia typów w określonych zestawach, do których istnieją odniesienia '', co pozwala mi wybrać tylko te z niejednoznacznymi odwołaniami, co szybko rozwiązuje problem w ten sposób.

Mam nadzieję, że pomoże to komuś innemu.

Jan
źródło
0

Moje interfejsy usługi WCF znajdują się w zestawie, implementacja znajduje się w innym, a odwołanie do usługi znajduje się w jeszcze innym zestawie, niezależnie od klientów odwołania do usługi. Otrzymałem komunikat o błędzie zaraz po zastosowaniu DataContract do wyliczenia. Po zastosowaniu EnumMember do pól wyliczenia problem został rozwiązany.

zsolt világos
źródło
0

Jeśli masz wątpliwości, że Twoja usługa nie ma żadnych problemów (takich jak problemy z wyliczeniami lub klasami, których nie można serializować, o czym wspominali inni), spróbuj utworzyć nowy projekt z nowym odwołaniem.

Używam Silverlight 5 i kilka razy próbowałem usunąć i odtworzyć odniesienie. reference.csPlik po prostu wymyślił całkowicie opróżnić za każdym razem i to było dosłownie lat, odkąd go stworzył więc próbuje dowiedzieć się, co się zmieniło w służbie było wykluczone.

Zauważyłem, że błąd zawierał odniesienia do wersji 2.0.5.0. Teraz nawet nie wiem, czy jest to rzeczywiście istotne dla wersji Silverlight, ale przypomniało mi się o stworzeniu zupełnie nowego projektu i nagle wszystko zadziałało.

Ostrzeżenie 2 Ostrzeżenie narzędzia niestandardowego: Nie można zaimportować pliku wsdl: portType Szczegóły: zgłoszono wyjątek podczas uruchamiania rozszerzenia importu WSDL: System.ServiceModel.Description.DataContractSerializerMessageContractImporter Błąd: nie można załadować pliku lub zestawu „System.Xml, Version = 2.0.5.0, Culture = neutral, PublicKeyToken = 7cec85d7bea7798e 'lub jedna z jego zależności. System nie może odnaleźć określonego pliku. XPath to Error Source: // wsdl: definitions [@targetNamespace = ''] / wsdl: port Type [@ name = 'IShoppingCart']

Simon_Weaver
źródło
0

Przeglądałem swój projekt i miałem ten sam problem. Okazało się, że są to różne wersje tej samej biblioteki DLL w witrynie WCF i w witrynie sieci Web. Witryna sieci Web zawiera nowszą wersję biblioteki DLL, a usługa odwołuje się do starszej wersji biblioteki DLL. Gdy wszystkie były zsynchronizowane, wszystko działało dobrze.

CBBSpike
źródło
0

Doświadczyłem tego samego błędu. Przez prawie dzień walczyłem, próbując dowiedzieć się, co się dzieje. Wskazówką dla mnie były ostrzeżenia, które rzucał VS. Próbowałem wykonać jakieś mapowanie do Yahoo.Yui.Compressor.dll, biblioteki, którą dodałem i usunąłem (ponieważ zdecydowałem się jej nie używać) kilka dni wcześniej. To było szokujące, ponieważ biblioteki tam nie było, ale w jakiś sposób próbowała się do niej odwołać.

Na koniec przywracam ten plik dll z kosza, a następnie mogę pomyślnie zaktualizować odwołanie do usługi.

cdiaz
źródło
0

Dla każdego tutaj w przyszłości miałem ten sam błąd, ale spowodowany problemami z wersją na dwa różne sposoby.

Mam dwie usługi WCF i dwie aplikacje klienckie, które komunikują się za pośrednictwem odwołań do usług. Zaktualizowałem pakiet NuGet po obu stronach i próbowałem zaktualizować odwołanie do usługi i otrzymałem ten błąd.

Usuwanie nie pomogło. Odznaczenie opcji „ponowne wykorzystanie zespołów” nie jest pożądane, ponieważ muszę ich użyć ponownie - o to chodzi.

W końcu pojawiły się dwie odrębne kwestie:

1) Pierwszy problem, jak sądzę, dotyczył buforowania w Visual Studio. Skrupulatnie przejrzałem wszystkie odniesienia i nie znalazłem żadnych problemów, ale nadal zgłaszałem, że nie mogę znaleźć poprzedniej wersji pliku. Odinstalowałem wszystkie pakiety NuGet, ponownie uruchomiłem program Visual Studio i ponownie je zainstalowałem. Aktualizacja odniesienia do usługi zadziałała.

2) Drugi problem był spowodowany problemem zależności. Zaktualizowałem pakiet NuGet po obu stronach i wszystko wyglądało na poprawne, ale nieoznakowana zależność była niezsynchronizowana. Przykład:

Pakiet Foo v1 odwołuje się do Bar v1. Możliwe jest niezależne zaktualizowanie Foo i Bar do v2 bez aktualizowania odniesienia. Jeśli zainstalujesz zarówno Foo, jak i Bar v2, narzędzie serwisowe przeskanuje Foo v2, zobacz odniesienie do Bar v1 i zakończy się niepowodzeniem, ponieważ nie może znaleźć starszej wersji. Jest to zgłaszane poprawnie tylko wtedy, gdy zaktualizujesz numery wersji swojej biblioteki dll dla każdego pakietu. Visual Studio i MSBuild nie będą miały problemu z budowaniem aplikacji, ale odwołanie do usługi będzie miało straszny czas, próbując rozwiązać wszystko.

Mam nadzieję, że to komuś pomoże.

TheMightyGherkin
źródło