This week we need to choose the most appropriate communication technology for one of our projects.
The project constraints are the following:
- .NET on both client and server
- client and server on same LAN
- A lot of information to be passed from server to client and vice-versa
- Performance is important
- Typed DataSets will be used on server side
- Presentation layer is developed with WPF
- Security is needed (sensitive or confidential data)
The options we have are the following:
- ASMX Web Services
- .NET Remoting
- WCF
I clearly favour option 3. First, given that this is considered a .NET 3.0 project (the presentation layer will be developed in WPF), I prefer to be consistent and use WCF. Second, the .NET Remoting option is not really an option. We have no experience with it and its future does not seem promising (given the arrival of WCF). If we have to learn something new, we might as well go for WCF.
The advantages of the ASMX Web Service option is that we have a lot of experience with it. However, WCF offers better performance. Given the amount of data that will need to be transferred, I am worried about performance. This MSDN paper compares the performance of WCF with existing technologies. The conclusions are the following:
- WCF (basicHttpBinding) is 25%-50% faster than ASMX Web Services
- WCF is approximately 25% faster than .NET Remoting
So, now within WCF, what are our options?
- basicHttpBinding : Basically the equivalent of ASMX Web Services in .NET 3.0
- wsHttpBinding : Web Services implementing WS-Security. They offer message-level security: authentication, encryption and signing.
- netTcpBinding: The "equivalent" of .NET Remoting in .NET 3.0, with the advantage that it is easier to code (given the standardization of all communication techniques)
For a table comparing the different bindings, here or this MSDN article.
I have not been able to find a Microsoft article comparing the performance of the different bindings (besides this one) but this is what I have picked up from different blogs and forums.
- netTcpBinding should be the fastest, given the binary serialization (vs. Text in basicHttpBinding). However, you should we aware of their different default settings when comparing them. netTcpBinding and wsHttpBinding both have security enabled by default (at transport and message level respectively), and the later has ReliableSessions turned on (source: here and here). I read somewhere (sorry ... lost the URL) that it is 25%-50% faster than basicHttpBinding.
- basicHttpBinding gives pretty good performance compared to ASMX Web Services and, given that there is no security, even compared to wsHttpBinding and netTcpBinding. A couple of extra tips to increase its performance even more:
- do not send the DataSet schema
- use MTOM encoding instead of Text ("MTOM is a mechanism for transmitting large binary attachments with SOAP messages as raw bytes, allowing for smaller messages")
In my opinion, netTcpBinding is a very good option for us given its good performance and security options. On the other hand, it does not respect the tenets of SOA. But ... do we really need SOA? We are dealing with an application that will be deployed inside a LAN and where both client and server are implemented in .NET. Moreover, if we are going to send typed DataSets from server to client (very probable), we have already broken the tenets of SOA.
As for security options in netTcpBinding that might reduce the performance advantage, we can go for the lightest option which is transport security (source: here).
I don't think basicHttpBinding with MTOM encoding is good option for us because MTOM is particularly interesting when sending large binary items (such as pictures, videos, etc.): "the MTOM standard allows for externalizing large data elements that are contained in a message and to carry them with the message as binary data without any special encoding" (source: MSDN). And not sending the DataSet schema reduces message size significantly only when few data is sent. As the message contains more data, the proportion of space taken up by the schema drastically diminishes.
The wsHttpBinding is very interesting if you need to implement the WS-* standards, which is not our case. Admittedly, you can also use wsHttpBindings if you want Web Services (to be SOA compliant) and you need full security. But the whole WS-* paraphernalia clearly impacts performance ...
To finish up, just a link to one of the leading WCF experts: Michele Leroux Bustamante (she must have some Spanish blood with a surname like that!)
Technorati tags:
WCF,
Indigo,
Web Services