Błąd odniesienia do usługi: Nie udało się wygenerować kodu odwołania do usługi

132

Mam rozwiązanie usługi Windows i próbuję dodać odwołanie do usługi do usługi sieci Web Hermes (serwer komunikatów OpenSource ebms) w VS2010.

Mogę znaleźć usługę sieci Web za pomocą jej adresu URL, ale kiedy próbuję wypełnić odwołanie do usługi, otrzymuję następujące błędy w programie Visual Studio:

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

Niektóre dochodzenie zdawało się sugerować, że jest to spowodowane tym, że svcutil.exe nie mógł zbudować serwerów proxy z powodu braku uprawnień do katalogu (prawdopodobnie c: \ windows \ temp). Próbowałem przypisać różne uprawnienia dostępu, ale nie jestem pewien, który użytkownik potrzebuje pozwolenia, czy też jest to tylko czerwony śledź.

Wszelkie pomysły będą mile widziane.

Dzięki

jheppinstall
źródło

Odpowiedzi:

303

Musisz odznaczyć opcję Ponowne użycie typów we wszystkich przywoływanych zestawach z opcji Konfiguruj odwołanie do usługi

Sprawdź to, aby uzyskać szczegółowe informacje

Mohan
źródło
3
Alternatywnie, gdy faktycznie potrzebne jest „ponowne użycie typów w zestawach, do których istnieją odwołania”, można dodać odwołanie do usługi z projektu biblioteki klas utworzonego specjalnie w tym celu. Sprawdź moją odpowiedź, aby uzyskać dodatkowe informacje.
Florin Dumitrescu
Chciałem rozwiązania bez odznaczania „typów ponownego użycia” i udało mi się znaleźć takie, które działało, zobacz moją odpowiedź tutaj .
Shahin Dohan
Zamiast robić coś takiego, użyj zestawów, od których zależy klient WCF, zamiast ślepo używać wszystkich przywoływanych elementów.Może to być trudne i bardziej czasochłonne niż odznaczanie odpowiedniego pola wyboru, ale uważam to rozwiązanie za bardziej odpowiednie niż to oznaczono jako odpowiedź.
Oscar Guillamon
Upewnij się również, że Twój projekt nie jest tylko do odczytu. To był mój problem ...
arihanth jain
126

Kliknij prawym przyciskiem myszy numer referencyjny usługi i wybierz Configure Service Reference...

Skonfiguruj odwołanie do usługi

Następnie odznacz Reuse types in referenced assemblies

Ponownie wykorzystaj typy

Kliknij OK, wyczyść i odbuduj swoje rozwiązanie.

Darren
źródło
2
Co się stanie, jeśli muszę ponownie użyć zestawów, do których istnieją odwołania? Mam projekt i to pole jest zaznaczone. Aktualizacja działa na moim komputerze, ale na komputerze współpracownika nie ma ... żadnych wskazówek?
Ricardo Appleton
Stało się tak, kiedy wraz z projektem uaktualniłem wersję 4.6.1 do wersji 4.7. To naprawiło.
Mike Flynn,
17

Napotkałem również podobny błąd podczas próby wygenerowania klienta usługi sieciowej z projektu ASP .Net MVC 4.0 przy użyciu programu Visual Studio 2012.

Wydaje się, że źródłem problemu jest fakt, że projekt, z którego próbowałem wygenerować klienta, odwoływał się do zestawu, który z kolei był zależny od innego zestawu, do którego również nie odwoływał się.

Gdy w konfiguracji usługi włączona jest opcja „Ponowne użycie typów w przywoływanych zestawach”, generator usług prawdopodobnie sprawdza wszystkie przywoływane zestawy, aby uzyskać listę typów, które można ponownie wykorzystać. Fakt, że jeden z przywoływanych zestawów odwołuje się do innego zestawu, który nie jest dostępny, prawdopodobnie powoduje awarię generatora.

Usunięcie zaznaczenia opcji „Ponowne użycie typów w zestawach, do których istnieją odwołania” w konfiguracjach usług rozwiąże powyższy problem , ale ma on efekt uboczny. Opcja ponownego użycia typów jest nie bez powodu iw niektórych przypadkach pozwala uniknąć niepotrzebnego rzutowania w kodzie korzystającym z usługi.

Na przykład jeśli sama usługa jest zbudowana przy użyciu programu WCF, a niektóre parametry metod w niej zawarte są typu System.Guid, zostaną one przetłumaczone na ciągi w wygenerowanym kliencie, jeśli opcja ponownego użycia typów jest wyłączona.

Alternatywa, którą wolę wyłączać ponowne używanie typów, jest dodanie odwołania do usługi z projektu biblioteki klas specjalnie utworzonego w tym celu. Jedyną rzeczą, o której należy pamiętać, jest skopiowanie wszystkich konfiguracji związanych z usługą z pliku app.config biblioteki klas do pliku konfiguracyjnego projektu startowego.

Jeśli istnieją typy zdefiniowane w zestawach lokalnych, które muszą być ponownie użyte w kliencie usługi, wystarczy odwołać się do tych zestawów z wyżej wymienionego projektu biblioteki klas, wraz ze wszystkimi ich zależnościami.

Florin Dumitrescu
źródło
Dziwne. Zmieniłem moje powiązanie z HttpBinding na NetNamedPipeBinding (dodałem także punkt końcowy mex) i napotkałem to w moim zestawie klienta A. Utworzyłem nową bibliotekę klas B, która odwołuje się do mojej usługi WCF. Potem dodałem B jako odniesienie do A i magicznie wszystko znów działa. Bardzo dziwny. Dzięki za rozwiązanie
citronas
1

Byłoby niezwykle trudno odgadnąć problem, ponieważ jest on spowodowany błędem w WSDL i bez zbadania WSDL nie mogę nic więcej skomentować. Więc jeśli możesz udostępnić swój WSDL, zrób to.

Wszystko, co mogę powiedzieć, to to, że wydaje się, że brakuje schematu w WSDL (z docelową przestrzenią nazw „http://service.ebms.edi.cecid.hku.hk/”). Wiem o problemach i różnych sposobach obsługi schematu, gdy instrukcje dołączania są ignorowane.

Generalnie uważam, że implementacja usług internetowych firmy Microsoft jest całkiem dobra, więc myślę, że usługa sieciowa odsyła podejrzane WSDL.

Aliostad
źródło
Dzięki Aliostad, spróbuję udostępnić WSDL, gdy wrócę z pracy.
jheppinstall
0

Otrzymuję ten sam błąd w Silverlight 5 (VS2012)

Możesz również usunąć odniesienia do:

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

Po zaktualizowaniu odniesień do usług pamiętaj, aby dodać je ponownie.

CartoJunkie
źródło
0

Jak wspomniano powyżej, możliwych jest kilka różnych problemów. Okazało się, że biblioteka .DLL dla biblioteki WCF została dodana jako odwołanie do projektu klienta. To z kolei powodowało problemy z rozwiązywaniem obiektów, a tym samym powodowało „opróżnianie” plików przez etapy generowania kodu. Odznaczenie opcji „Ponowne użycie typów ...” może wydawać się odpowiedzią, ale tworzy dodatkowe definicje typów obiektów, które są proxy do rzeczywistych typów, w nowej przestrzeni nazw, co powoduje różnego rodzaju problemy z „zgodnością” z stosowanie tych typów. Tylko jeśli naprawdę chcesz "ukryć" typ, powinieneś zaznaczyć tę opcję.

Ukrycie typu jest odpowiednie, jeśli nie chcesz, aby zależność typu „DLL” „przeciekała” do projektu, który chcesz oddzielić od innego. Jeśli biblioteka DLL projektu biblioteki WCF wkrada się do odwołań do projektu klienta, wystąpi ten problem z wszelkiego rodzaju dziwnymi efektami ubocznymi, ponieważ definicje typów znajdują się również w bibliotece DLL.

Grwon
źródło
0

napotykają ten sam problem, rozwiązany przez uruchomienie programu Visual Studio w trybie administratora

Prashant
źródło
0

Napotkałem ten problem podczas uaktualniania rozwiązania VS2010 WCF + Silverlight w VS2015 Professional . Oprócz automatycznej aktualizacji z Silverlight 4 do Silverlight 5, wartość pola wyboru ponownego wykorzystania referencji usługi została zmieniona i generowanie nie powiodło się.

Alexei
źródło
0

„Ponowne użycie typów” nie zawsze stanowi problem, gdy występuje ten błąd.

Dodając odniesienie do starszej usługi, kliknij „zaawansowane” i tam „Dodaj odniesienie do sieci”. Teraz połącz się z Twoim wsdl i wszystko powinno działać.

FrankyHollywood
źródło
0

Jeśli chcesz to poprawić bez odznaczania pola wyboru ponownego wykorzystania zespołu, to zadziałało:

  • Usuń zestaw, do którego istnieje odniesienie, którego chcesz użyć ponownie
  • Usuń cały folder bin projektu
  • Zaktualizuj odniesienie do usługi
    • Zachowaj „Ponowne użycie typów w określonych zestawach, do których istnieją odniesienia”
  • Dodaj ponownie odniesienie do zestawu, aby naprawić błędy
  • Zaktualizuj ponownie odniesienie do usługi
popiandro
źródło
0

Ponowne uruchomienie programu Visual Studio załatwiło sprawę. Używam VS 2015.

KodowanieYoshi
źródło
-1

Miałem ten problem podczas próby zaktualizowania odwołania do usługi (błąd pojawia się tylko podczas dodawania odwołania do usługi), ale nie chciałem usuwać pola wyboru ponownego użycia zestawu.

U mnie zadziałało:

  • Usuń zestaw, do którego istnieje odniesienie, którego chciałem ponownie użyć
  • Zaktualizuj odniesienie do usługi
  • Zachowaj „Ponowne użycie typów w określonych zestawach, do których istnieją odniesienia”
  • Zignoruj ​​błędy, ponieważ brakuje odniesienia!
  • Dodaj ponownie odniesienie do zestawu, aby naprawić błędy
  • Zaktualizuj ponownie odniesienie do usługi

Voila, teraz faktycznie aktualizuje się i nie próbuje już usuwać całego wygenerowanego kodu.

Byłem prawie gotowy zrezygnować z funkcji ponownego wykorzystania typów ...

EDYCJA: Upewnij się również, że konfiguracja kompilacji to AnyCPU lub x86, ponieważ svcutil zawiera błędy z x64.

Do przeciwnika: przepraszam, jeśli to nie zadziałało dla ciebie, nawet nie wiem, dlaczego zadziałało dla mnie, ale zadziałało. Być może tym razem zrobiłem coś innego, co rozwiązało problem, ale teraz nie mogę się tego dowiedzieć.

Shahin Dohan
źródło