Reuse of WCF service clients

I have a WCF webservice that acts as a data provider for my ASP.NET web page.

Throughout the web page a number of calls are made to the web service via the auto-generated ServiceClient.

Currently I create a new ServiceClient and open it for each request i.e. Get Users, Get Roles, Get Customer list etc…. Each one of these would create a new ServiceClient and open a new connection.

Can I make my ServiceClient class a global or statically available class so that all functions within my ASP.NET web page can use the same client. This would seem to be far more efficient. Are there any issues with doing it this way? Any advice I should take into account when doing this?

What happens if I make multiple requests to a client? Presumably it is all synchronous so it shouldn’t matter if I make 1 or 50 calls to it?

Thanks

Answers:

Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.

Method 1

When session (wsHttp with security context or reliable session) or connection (net.tcp, net.pipe) oriented binding is used you have to handle your proxy in the way you want to handle the session. So if you share the proxy, all calls will be handled in single WCF session (by default handled by single service instance). But you have to deal with additional complexity like: Unhandled service exception will terminate your channel and following call from client will result in exception.

When session-less HTTP binding (basicHttp, webHttp) is used you can share your proxy or even make it static. Each call is handled separately, exception on a service will not fault the channel and it transparently reuses opened HTTP persistent connections. But because of this, there should be no big overhead to creating new proxy / channel.

So my suggestion is: When you need several calls to your service in single request processing in your ASP.NET application, use the same proxy / channel. But don’t share proxy / channel among different requests.

Method 2

I think using a ChannelFactory could take of your problem. If I’m right the ChannelFactory has a pool of your connection and re-uses the channels. The advantage of this is that the channels don’t get instatiated each time, only the first.

Read more here: ChannelFactory

To handle the disposing of the channels you need some special handling since the channel can throw exception in dispose. I wrote a mapper to handle this, you can read about it here: http://blog.tomasjansson.com/2010/12/disposible-wcf-client-wrapper/


All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x