Windows Communication Foundation is becoming sort of obsolete in favor of ASP.NET Web API, which has been advertised as primary technology for building web services. However, the latter obviously cannot serve as a full equivalent of the former. WCF still is a powerful technology for enterprise class service oriented architecture. For that purposes, the decision of switching the transport protocol from http to net.tcp sooner or later must be made clearly for performance reasons. From my experience I can tell having 100% working configuration of a service hosted inside the IIS is surprisingly hard and a developer has to face a series of quirks to bring the services back to life. Let’s sum up all the activities that can help make a service working with the net.tcp.
- WCF Non-HTTP Activation service must be installed in Add/Remove programs applet of the Control Panel. It is not obvious, that it is a component of the operating system itself, not of the IIS.
- The TCP listener processes must be running. Check
netstat -ato see if there is a process listening on the port of your choice (the default is 808), check the following system services and start them if need be:
Net.Tcp Listener Serviceand
Net.Tcp Port Sharing. I have observed cases, where those services were unexpectedly shut down, e.g. after restart of the operating system.
- IIS management: the application must have net.tcp protocol enabled in its properties, as well as the site must have bindings for that protocol configured. If you have large number of services you can use my simplistic C# program which parses the IIS global configuration file —
applicationHist.config. Link to my OneDrive
- If this is first try of enabling the net.tcp protocol, run the following tools to ensure the components of the .NET Framework are correctly set up:
c:\Windows\Microsoft.NET\Framework\v4.0.30319\servicemodelreg.exe -ia. Use
Framework64for 64 bit system.
- Make sure that you are not running on the default endpoint configuration. The default configuration can be recognized in the WSDL of the service. It contains
<msf:protectionlevel>EncryptAndSign</msf:protectionlevel>code which is responsible for default authorization settings. These defaults manifest themsevles in a strange symptom of the service working in Test Client and not working in target client application. It is caused by Test Client having successfully recognized default binding configuration from WSDL whereas the target application uses your custom configuration and it is very likely these two do not match.
- Check for the equality of the service names in an
.svcfile and in the
Web.configfile (assuming that declarative binding is used instead of programmatically created one) in section
<system.serviceModel> -> <services> -> <service>
- Make sure that IIS has created a virtual directory for the application. Create it from Visual Studio by pressing appropriate button in the application’s properties.