The no frills, bare-bones example to Duplex WCF
Can a WCF client call a WCF service and have the server call back with whatever? Oh, yes. Can you get an example how it’s done? Indeed.
Are these good examples? Well, you can get MS samples for WCF (which in their entirety are really helpful) or another blog post on the subject. Don’t get me wrong, they work, but in my humble opinion they have shortcomings.
- They have funny classes and interfaces generated by svcutil with some really horrid artefacts
- The interfaces are not shared among client & server which annoys my desire for harmony and DRYness, which should be followed even in an example (or, maybe, especially in an example).
Anyway, here’s my version, which is quite reduced to just the duplex stuff.
Common bits
That’s the Server interface which the client will use to talk to the server. Please note the _CallBackContract _property of the _ServiceContract _attribute. That’s the interface that will have to be implemented by the client. The server will use it to call back.
All this IsOneWay business is one way to avoid issues when you’re calling back a client within the method that is being called by the client. The issues are described here.
Server
Of course we need an implementation of the service (d’oh):
The important line is the very first one. The rest is just a crappy example to get some funny callback side-effects. Next we have the configuration of the thing…
And some boilerplate to get it running e.g. in a command-line:
If you want to save yourself the configuration etry in the app.config file, you can also set up the ServiceHost programmatically:
Client
Want to call the server? Well, first you could go and configure it:
Then it’ll make sense to provide an implementation of the Callback interface:
Brill! Finally the boilerplate to kickstart the thing:
Again, if you prefer working without a configuration entry, you can set this up programmatically, too:
That’s it, you shouldn’t need more, honest, dude. No generated class in sight, all interfaces are the same throughout Client and Server. Distribute over projects/threads/app domains at your leisure and enjoy.
Update: Here is a small vs2008 solution that shows the programmatic setup of this blog post.