Błąd WCF - nie można znaleźć domyślnego elementu punktu końcowego, który odwołuje się do kontraktu „UserService.UserService”

98

Jakieś pomysły, jak to naprawić?

UserService.UserServiceClient userServiceClient = new UserServiceClient();
            userServiceClient.GetUsersCompleted += new EventHandler<GetUsersCompletedEventArgs>(userServiceClient_GetUsersCompleted);
            userServiceClient.GetUsersAsync(searchString);

.

<system.serviceModel>
    <bindings>
        <basicHttpBinding>
            <binding name="BasicHttpBinding_UserService" 
                     maxBufferSize="2147483647" 
                     maxReceivedMessageSize="2147483647">
                <security mode="None" />
            </binding>
        </basicHttpBinding>
    </bindings>
    <client>
        <endpoint address="http://localhost:52185/UserService.svc" 
                  binding="basicHttpBinding" 
                  bindingConfiguration="BasicHttpBinding_UserService" 
                  contract="UserService.UserService"
                  name="BasicHttpBinding_UserService" />
    </client>
    <behaviors>
        <serviceBehaviors>
            <behavior name="Shell.Silverlight.Web.Service3Behavior">
                <serviceMetadata httpGetEnabled="true" />
                <serviceDebug includeExceptionDetailInFaults="false" />
            </behavior>
        </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
    <services>
        <service behaviorConfiguration="Shell.Silverlight.Web.Service3Behavior" 
                 name="Shell.Silverlight.Web.Service3">
            <endpoint address="" 
                      binding="basicHttpBinding" 
                      contract="Shell.Silverlight.Web.Service3" />
            <endpoint address="mex" 
                      binding="mexHttpBinding" 
                      contract="IMetadataExchange" />
        </service>
    </services>
</system.serviceModel>

Nie można znaleźć domyślnego elementu punktu końcowego, który odwołuje się do kontraktu „UserService.UserService” w sekcji konfiguracji klienta ServiceModel. Może to być spowodowane tym, że nie znaleziono pliku konfiguracyjnego dla Twojej aplikacji lub nie można znaleźć elementu punktu końcowego pasującego do tego kontraktu w elemencie klienta.

Zdecydowany!

Nie wspomniałem, że to aplikacja Silverlight. Miałem odwołanie do wcf w bibliotece DLL, która miała swój własny plik „ServiceReferences.ClientConfig”. Przeniosłem zawartość ServiceReferences.ClientConfig biblioteki DLL do głównego projektu Silverlight i zadziałało.

NotDan
źródło
co się stanie, jeśli aplikacja, na której działa biblioteka DLL, jest stroną trzecią, np. biblioteka DLL jest wtyczką do innej aplikacji?
Stefanos Kargas

Odpowiedzi:

186

Miałem ten sam problem. Moja aplikacja była również aplikacją Silverlight i usługa była wywoływana z biblioteki klas z niestandardową kontrolką UserControl, która była w niej używana.

Rozwiązanie jest proste. Skopiuj definicje punktów końcowych z pliku konfiguracyjnego (np. ServiceReferences.ClientConfig) biblioteki klas do pliku konfiguracyjnego aplikacji Silverlight. Wiem, że spodziewałbyś się, że zadziała bez konieczności robienia tego, ale najwyraźniej ktoś w Redmond miał tego dnia wakacje.

krasnoludek
źródło
50
To rozwiązanie dotyczy również projektów ASP.NET i MVC. Jeśli dodasz usługę do biblioteki klas, to nie zadziała, pobierz sekcję system.serviceModel z pliku app.config w projekcie biblioteki i umieść ją w swoim web.config.
Adam Pope
5
Wygląda na to, że jest to prawdą w przypadku każdego projektu. Używałem quartz.net jako usługi systemu Windows i miałem pracę na innym zestawie, który odwoływał się do usługi sieciowej. U mnie też się udało. Dzięki.
thiagoleite,
2
Cześć, zadziałało również w przypadku projektu Windows Phone. Jak mówi @thiagoleite, wygląda na to, że działa w większości typów projektów.
Thanushka
3
+1 dla żartu z wakacji z Redmond ... W każdym razie, czy jest sposób, aby dodać go jako plik zewnętrzny zamiast grać z web.config?
Shimmy Weitzhandler
1
@sprite Skończyło się na ustawianiu moich wymaganych ustawień w kodzie (nadpisałem konstruktora klienta), jako odpowiedź Vishala . W ten sposób jest wysyłany między zespołami. Dzięki!
Shimmy Weitzhandler
45

Możesz również ustawić te wartości programowo w bibliotece klas, co pozwoli uniknąć niepotrzebnego przenoszenia plików konfiguracyjnych w bibliotece. Przykładowy kod dla prostego BasciHttpBinding to -

BasicHttpBinding basicHttpbinding = new BasicHttpBinding(BasicHttpSecurityMode.None);
basicHttpbinding.Name = "BasicHttpBinding_YourName";
basicHttpbinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.None;
basicHttpbinding.Security.Message.ClientCredentialType = BasicHttpMessageCredentialType.UserName;

EndpointAddress endpointAddress = new EndpointAddress("http://<Your machine>/Service1/Service1.svc");
Service1Client proxyClient = new Service1Client(basicHttpbinding,endpointAddress);
Vishal
źródło
@wooncherk, moja biblioteka klas ma tylko odniesienie do wsdl. Gdzie mam umieścić ten kod? Buduję go w dll C # i umieszczam dll w moich plikach aplikacji, gdzie odwołuję się do niego z IronPython. Dziękuję
Срба
12

Na wszelki wypadek, gdy ktoś napotka ten sam problem podczas korzystania z WPF (zamiast WCF lub Silverlight):

Miałem ten błąd podczas łączenia się z usługą internetową. Kiedy mój kod znajdował się w "głównym" rozwiązaniu aplikacji WPF, nie ma problemu, działał idealnie. Ale kiedy przeniosłem kod do bardziej sensownego rozwiązania warstwy DAL, wyrzuciło to wyjątek.

Nie można znaleźć domyślnego elementu punktu końcowego, który odwołuje się do kontraktu „MyWebService.MyServiceSoap” w sekcji konfiguracji klienta ServiceModel. Może to być spowodowane tym, że nie znaleziono pliku konfiguracyjnego dla Twojej aplikacji lub nie można znaleźć elementu punktu końcowego pasującego do tego kontraktu w elemencie klienta.

Jak powiedział "Sprite" w tym wątku, musisz ręcznie skopiować tag.

W przypadku aplikacji WPF oznacza to skopiowanie tagu z pliku app.config w moim rozwiązaniu DAL do pliku app.config w głównym rozwiązaniu aplikacji WPF.

Mike Gledhill
źródło
to jest świetne, ale byłoby lepsze jako krótki komentarz pod moją własną odpowiedzią, tak jak zrobił to „Adam Pope”. Przeczytałoby go znacznie więcej osób.
sprite,
2
@sprite: Dodałbym komentarz, ale komentarze StackOverflow są zawsze wyświetlane jako jeden długi akapit. W przypadku 5-akapitowej odpowiedzi, takiej jak moja, spowodowałoby to jeden długi, nieczytelny, nieprzyjazny akapit. Napisanie osobnej odpowiedzi pozwoliło mi udzielić jaśniejszej odpowiedzi, która z większym prawdopodobieństwem pomoże innym użytkownikom (co, nie oszukujmy się, jest celem takich witryn)
Mike Gledhill,
6

Natknąłem się na ten sam problem, z jakiegokolwiek powodu Visual Studio nie zaktualizował konfiguracji internetowej, kiedy po raz pierwszy dodałem usługę. Zauważyłem, że aktualizacja odniesienia usługi również rozwiązała ten problem.

Kroki:

  1. Przejdź do folderu odwołania do usługi
  2. Rozwiń to
  3. Kliknij prawym przyciskiem myszy i wybierz odniesienie do usługi aktualizacji
  4. Obserwuj aktualizację Web Config
Dale C
źródło
Tak, to załatwiło sprawę dla mnie. Używam odniesienia do usługi
WSDL
Dla mnie też. Było to oczywiste, ponieważ działa dobrze i nagle nie. Mogłem dokonać zmiany i nie zaktualizowałem odniesienia do usługi.
ehh,
4

Zmień plik web.config usługi WCF na „endpoint address =" "binding =" basicHttpBinding "..." (poprzednio binding = "wsHttpBinding") Po skompilowaniu aplikacji w "ServiceReferences.ClientConfig" "" configuration> ma wartość . Wtedy będzie działać dobrze.


źródło
3

Zmień nazwę pliku output.config utworzonego przez svcutil.exe na app.config. to działało dla mnie.

ssilas
źródło
2

Czy masz interfejs, który implementuje Twoja klasa „UserService”.

Twoje punkty końcowe powinny określać interfejs dla atrybutu kontraktu:

contract="UserService.IUserService"
Nick Josevski
źródło
1

Nie jestem pewien, czy to jest problem. Punkt końcowy i powiązanie mają tę samą nazwę

david walentynki
źródło
1

Nie jestem pewien, czy to naprawdę problem, ale widzę, że masz taką samą nazwę dla konfiguracji wiązania ().

Zwykle próbuję nazywać moje punkty końcowe czymś w rodzaju „UserServiceBasicHttp” lub czymś podobnym („Binding” naprawdę nie ma tu nic do roboty) i próbuję nazwać moje konfiguracje powiązań czymś z „.... Konfiguracja”, np. „UserServiceDefaultBinding”, aby uniknąć potencjalnych konfliktów nazw.

Marc

marc_s
źródło
0

Musiałem dodać usługę w wywołującym pliku App.config, aby działała. Upewnij się, że jednak to ty. To wydawało się działać dla mnie.

Jackstine
źródło
0

Ten problem występuje podczas korzystania z usługi za pośrednictwem innej aplikacji.Jeśli aplikacja ma plik konfiguracyjny, po prostu dodaj informacje o konfiguracji usługi do tego pliku. W mojej sytuacji nie było żadnego pliku konfiguracyjnego, więc używam tej techniki i zadziałało. Wystarczy zapisać adres url w aplikacji, odczytać go i za pomocą metody BasicHttpBinding () wysłać go do aplikacji serwisowej jako parametr. to:

Configuration config = new Configuration(dataRowSet[0]["ServiceUrl"].ToString());

var remoteAddress = new System.ServiceModel.EndpointAddress(config.Url);


SimpleService.PayPointSoapClient client = 
    new SimpleService.PayPointSoapClient(new System.ServiceModel.BasicHttpBinding(), 
    remoteAddress);
SimpleService.AccountcredResponse response = client.AccountCred(request);
Suleymani Tural
źródło
0

Dla tych, którzy pracują z usługami AX 2012 AIF i próbują wywołać tam projekt C # lub VB wewnątrz AX (x ++) i cierpią z powodu takich błędów „nie można znaleźć domyślnego punktu końcowego” ... lub „nie znaleziono umowy” ... wróć do projektu Visual Studio (C #) i dodaj te wiersze przed zdefiniowaniem klienta usługi, a następnie wdróż projekt i zrestartuj klienta AX i spróbuj ponownie: Uwaga, przykład dotyczy adaptera NetTcp , zamiast tego można łatwo użyć dowolnego innego adaptera zgodnie z potrzebami .

 Uri Address = new Uri("net.tcp://your-server:Port>/DynamicsAx/Services/your-port-name");
 NetTcpBinding Binding = new NetTcpBinding();
 EndpointAddress EndPointAddr = new EndpointAddress(Address);
 SalesOrderServiceClient Client = new SalesOrderServiceClient(Binding, EndPointAddr);
Boody
źródło
-2

W przypadku, gdy używasz aplikacji WPF przy użyciu środowiska PRISM, wówczas konfiguracja powinna istnieć w projekcie startowym (tj. W projekcie, w którym znajduje się program ładujący).

Krótko mówiąc, po prostu usuń go z biblioteki klas i umieść w projekcie startowym.

VRK
źródło