I work on project where web application hosted on web server calls WCF services hosted on the app server. Proxy for WCF calls is created by ChannelFactory and calls are made via channel, example:
(omitting using block)
var factory = new ChannelFactory<IUserService>(endpointConfigurationName);
var channel = factory.CreateChannel();
var users = channel.GetAllUsers();
If I understand it well call via channel is async and thread on the web server is idle during request and just wait for a response.
I would like to make call async like this:
var users = await channel.GetAllUsersAsync();
Is there a way how to make call with ChannelFactory and channels async? I didn't find any. I know that I can generate async methods via svcutil / Add service reference but I do not want to do that. Also I don't want to change interface of service on app server (IUserService) by adding async methods.
Is there any way how to call methods async with ChannelFactory? Thanks.
Best Answer
You can automatically generate new interface that contains async versions of methods from original interface using T4 and use it in
ChannelFactory
without changing interface on server side.I used NRefactory to parse original and generate new C# source code and AssemblyReferences.tt to use nuget packages in T4 template:
You pass your interface file name to template:
To get new one:
Now you can put it in factory to use channel asynchroniously: