WCF Async without proxies
I don't like generated proxies for web services, they are generally ugly and not fun to work with. However, up until recently I believed that I had to deal with them if I wanted to use the async operations for web services. As it turn out, I was wrong.
We can actually define an WCF service interface like this:
[ServiceContract]
public interface IAsyncBus
{
[OperationContract(AsyncPattern = true)]
IAsyncResult BeginProcess(IMessage[] request, AsyncCallback callback, object asyncState);
IMessage[] EndProcess(IAsyncResult result);
}
Now you can work with it using:
IAsyncBus bus = new ChannelFactory<IAsyncBus>().CreateChannel();
ar = bus.BeginProcess(...);
//do work
bus.EndProcess(ar);
The problem with that is that on the server side, I also have to do things in an async manner. This is sometimes appropriate, but it tends to be a major PITA for a lot of things.
As it turn out, we can solve the issue with aliasing. In the interface dll, we can define:
[ServiceContract]
public interface IBus
{
[OperationContract]
IMessage[] Process(IMessage[] request);
}
[ServiceContract(Name="IBus")]
public interface IAsyncBus
{
[OperationContract(AsyncPattern = true)]
IAsyncResult BeginProcess(IMessage[] request, AsyncCallback callback, object asyncState);
IMessage[] EndProcess(IAsyncResult result);
}
Now, you can create an instance of IAsyncBus to communicate with IBus directory. On the server side, we implement IBus, and handle the message in a synchronous manner. Easy, simple, and doesn't require any proxies :-)