A vastag kliens alkalmazásunk Entity Framework entitásokat kér el a szervertől WCF-en keresztül. A kliens és a szerver oldal közös entitás típusokat használ úgy, hogy a kliens oldali WCF proxy generálásakor a közös entitás assembly-ben található típusokat használja fel a generátor. (“Resuse types from referenced assemblies” beállítás az “Add Service Reference” funkciónál a Visual Studio-ban)
A proxy generálás viszont nem működik, ha az entitások egy része tartalmaz körkörös referenciákat, mert akkor a generálás kivételre fut:
Error: Cannot import wsdl:portType
Detail: An exception was thrown while running a WSDL import extension: System.ServiceModel.Description.DataContractSerializerMessageContractImporter
Error: Referenced type … with data contract name ‘…’ in namespace ‘…’ cannot be used since it does not match imported DataContract. Need to exclude this type from referenced types.
A hibáról itt van egy összefoglaló:
Workaround gyanánt az entitásoknál ki kell kapcsolni a körkörös hivatkozást (“IsReference=false” ), és így kell generálni a proxy-t, majd utána újra vissza lehet kapcsolni a körkörös hivatkozást.
És ennél a pontnál lett világosság: hogyha körkörös referenciát használunk, akkor az már rég nem interop webszolgáltatás. Sőt, mivel kliens oldalon és szerver oldalon is .NET van, ez nem is igény, és sokkal egyszerűbb, ha a contract is közös, és egyáltalán nem lenne kliens proxy generálás. Szóval a WSDL-en keresztüli interfészt csak akkor érdemes használni, ha igény is van rá…
When should I use a channel factory?
Use a ChannelFactory when you control both ends of the wire and would rather code directly against the same CLR interface instead of manually keeping the WSDL interface in sync. Instead of using WSDL as the shared contract, you use a shared “interface assembly”.