tags:

views:

899

answers:

2

Hi, this is a more "can it be done" rather than a "how is it done" question. I'm looking at building a service (middle tier, .net, providing data abstraction and some business logic) that will be used by multiple internal client systems on different platforms. E.g. one client might be a web site, another client some java code, another client C#, etc.

I want to provide a synchronous and asynchronous API into my service, e.g. GetData, BeginGetData, EndGetData methods. I also want clients to be able to register for notifications of new "data" being added to the system. In the past I've implemented this using web services with a Tibco EMS channel for the notifications.

My question is: Could I achieve the three requirements (synch, asynch, and pub/sub) by exposing a WCF service? Could this service by consumed by non WCF clients?

Excuse the vagueness of this question - I can elaborate as needed.

Thanks in advance.

+2  A: 

Methods are synchronous by default. To make them asynch, you need to add this attribute [OperationContract(AsyncPattern=true)] and return an IAsynchResult, just like you would if you were doing BeginIvoke() with winforms. (read more here http://msdn.microsoft.com/en-us/library/ms734701.aspx)

You can do publish/subscribe with something called a Callback Contract (although im not sure about implementing this in other platforms) I don't have much experience with these, but they don't seem hugely complected(you can read more here http://dotnetaddict.dotnetdevelopersjournal.com/wcf_alarmclock.htm)

Matt Briggs
+2  A: 

Setting up async operations on your WCF service can be done as Ninja posted by setting AsyncPattern=true or it can be done on the client side by telling svcutil to generate the async end points by setting the correct command line argument or by checking the "Generate asynchronous operations" option in the GUI version of svcutil. Generating async will still generate synchronous operations as well.

The issue with the client async option is you will need to duplicate the code in Java. Svcutil does export VB or C# code as you specify so you could very likely translate the C# code to Java without too much work.

For Pub/Sub, client callbacks are how you want to operate. I am using them and they work very well. At the root level, they are .Net Remoting and use eventing to pass the data to the client (my understanding). I cannot confirm that this could be used cross platform but it should be with some work.

Chris Porter
Thanks - both - for your answers.
ng5000
WCF pub/sub is *not* .net remoting: it is full-duplex message exchange with a contract in both directions. It's actually a bit more restrictive than what you could do in .net remoting, but that's the cost of being more contract-based I guess
piers7