WCF chyba – “Could not find default endpoint element that references contract…”


Příčina

Příčinou vyhození této výjimky je to, že klient nemůže nalézt endpoint, na který se odkazuje reference na WCF službu. Při přidání reference na WCF službu se vytváří v konfiguračním souboru (například app.config) sekce <system.servicemodel> (v případě, že ještě není vytvořen konfigurační soubor, vytvoří se automaticky), ve které je nastavena komunikace s WCF službou. V této konfiguraci je například i nastavení cesty k WCF službě – element <endpoint> v sekci <client>. A právě tato část je způsobuje tuto výjimku – klientská aplikace požadovaný element <endpoint> nemůže nalézt.

Důvodem může být manipulace s konfiguračním souborem (ruční nebo v konfiguračním nástroji) a například smazání této části konfigurace atd.

Dalším důvodem může být to, že spuštěná aplikace nedokáže k této konfiguraci přistupovat i přes to, že je vše nakonfigurováno správně.

Řešení

První důvod je možné vyřešit relativně jednoduše updatováním reference na WCF službu – konfigurační soubor se aktualizuje a pokud nějaká část chybí, doplní se. Pokud by chyba nebyla odstraněna, je možné zkusit odebrat referenci na WCF službu, odstranit sekci <system.servicemodel> z konfiguračního souboru a přidat referenci znovu.

Druhý důvod často nastává, když je reference na WCF službu přidána do class library. Na tom samozřejmě není nic špatného, ale problém je v tom, že konfigurační soubor vytvořený v class library není používán ve spouštěné aplikaci. Spuštěná aplikace totiž nepoužívá konfigurační soubory připojených class library. Řešení je v podstatě jednoduché, stačí otevřít konfigurační soubor v class library, zkopírovat sekci <system.servicemodel> a vložit jí do konfiguračního souboru spouštěné aplikace (spouštěného projektu). Dalším řešením je použít konfigurační nástroj a s jeho pomocí nakonfigurovat přístup k WCF službě v konfiguračním souboru aplikace – výsledek bude stejný.

Pokud používáme referenci na WCF službu v class library, je důležité pamatovat si, že skutečně používaná konfigurace je v konfiguračním souboru spouštěné aplikace a ne v konfiguraci té class library. Takže například po updatu reference je nutné změnit i tento konfigurační soubor!

Další řešení?

Pokud by měl někdo jiné řešení a třeba i lepší, ať se o něj podělí v komentářích. Stejně tak, pokud někdo na tuto výjimku narazil z jiného důvodu a popsaná řešení mu nepomohla, ať napíše a článek případně rozšíříme. Podobně v případě nějaké mé chyby!

, ,

Komentáře jsou uzavřeny.