Windows Server 2022: come risolvere l’assenza del servizio Net.Tcp Listener Adapter (NetTcpActivator) per WCF .NET 4.8 su IIS/WAS

Su Windows Server 2022 può capitare che un’app WCF .NET 4.8 con binding net.tcp non parta perché non esiste (e quindi non si può avviare) il servizio Net.Tcp Listener Adapter (NetTcpActivator). In questa guida trovi cause, soluzione e verifiche passo‑passo.

Indice

Panoramica del problema

Un servizio o sito IIS che ospita un endpoint WCF con binding netTcpBinding non si avvia; in services.msc non compare il servizio Net.Tcp Listener Adapter, oppure risulta assente anche Net.Tcp Port Sharing Service. Di conseguenza, l’host WCF non riesce a rispondere sulle porte previste (ad esempio 808, 4502‑4506 o quelle definite nel baseAddress).

Perché accade

Net.Tcp Listener Adapter fa parte di Windows Process Activation Service (WAS) ed è installato solo quando si abilita la funzionalità WCF Services › Non‑HTTP Activation per .NET 4.8 (il nome della feature nei tool a riga di comando è WCF-NonHTTP-Activation45). Se questa non è presente, il servizio non appare in elenco e non può eseguire l’ascolto per i protocolli non‑HTTP (net.tcp, net.pipe, msmq) richiesti da WCF.

In più, per abilitare più applicazioni a condividere la stessa porta net.tcp (scenario tipico su IIS), è necessario che sia presente e in esecuzione anche Net.Tcp Port Sharing Service. Entrambi i servizi lavorano con WAS e con IIS, che forniscono il modello di attivazione del processo.

Soluzione rapida e affidabile

Di seguito tre modalità equivalenti per installare le dipendenze giuste su Windows Server 2022 e far comparire/avviare NetTcpActivator.

Metodo con Server Manager (GUI)

  1. Apri Server Manager → Add Roles and Features.
  2. Seleziona Web Server (IIS)Application Development:
    • ASP.NET 4.8
    • WCF Services
      • TCP Port Sharing
  3. Seleziona .NET Framework 4.8 FeaturesWCF Services:
    • Non‑HTTP Activation (installa Net.Tcp Listener Adapter)
    • HTTP Activation (opzionale, utile se l’app usa anche http/https)
  4. Conferma. Il componente Windows Process Activation Service verrà abilitato automaticamente come dipendenza.

Metodo con PowerShell (scriptabile)

Comando “tutto incluso” che copre framework, IIS, WCF e port sharing:

Install-WindowsFeature `
  -Name AS-NET-Framework,AS-WCF-Services,AS-TCP-Port-Sharing,Web-WebServer,NET-Framework-45-Features `
  -IncludeAllSubFeature -IncludeManagementTools

In alternativa, un comando più mirato ai soli componenti necessari per net.tcp su IIS:

Install-WindowsFeature `
  NET-Framework-45-Features, Web-WebServer, Web-Asp-Net45, `
  WAS, WAS-Process-Model, WAS-ConfigurationAPI, `
  WCF-Services45, WCF-NonHTTP-Activation45 `
  -IncludeManagementTools

Nota: i nomi possono variare leggermente a seconda dell’immagine; verifica con Get-WindowsFeature WCF e Get-WindowsFeature WAS.

Metodo con DISM (Server Core e ambienti minimi)

Su installazioni Server Core o quando preferisci DISM:

dism /online /enable-feature /featurename:WCF-NonHTTP-Activation45 /all

Riavvio e verifica dei servizi

  1. Apri services.msc e imposta su Automatico:
    • Net.Tcp Port Sharing Service (NetTcpPortSharing)
    • Net.Tcp Listener Adapter (NetTcpActivator)
  2. Avvia entrambi i servizi.
  3. Riavvia WAS o, se richiesto dal wizard, l’intero server.

Verifica da PowerShell:

Get-Service NetTcpPortSharing, NetTcpActivator | Select-Object Name, Status, StartType

Abilitare net.tcp in IIS: protocollo e binding

Su IIS il protocollo net.tcp va esplicitamente abilitato sul sito (o sull’app) e deve esistere un site binding net.tcp con la porta corretta.

  1. In IIS Manager, seleziona il sito che ospita la tua app.
  2. Clic su Bindings…AddType: net.tcpBinding information: 808:* (sostituisci 808 con la tua porta).
  3. Nel nodo Application della tua app, apri Advanced Settings… e in Enabled Protocols inserisci http,net.tcp (o solo net.tcp se non usi HTTP).

Configurazione via riga di comando (appcmd / PowerShell)

REM Aggiunge la porta net.tcp al sito
%windir%\system32\inetsrv\appcmd set site /site.name:"Default Web Site" /+bindings.[protocol='net.tcp',bindingInformation='808:*']

REM Abilita il protocollo net.tcp sull'app
%windir%\system32\inetsrv\appcmd set app "Default Web Site/MyApp" /enabledProtocols:"http,net.tcp" </code></pre>

<pre><code class="language-powershell">Import-Module WebAdministration

Binding net.tcp a livello di sito
New-WebBinding -Name "Default Web Site" -Protocol "net.tcp" -BindingInformation "808:*" -ErrorAction SilentlyContinue

Abilitazione protocolli sull'applicazione
Set-ItemProperty 'IIS:\Sites\Default Web Site\MyApp' -Name enabledProtocols -Value 'http,net.tcp'
</code></pre>

<h2>Esempio di configurazione WCF (.config)</h2>
<p>Configurazione minima per esporre un endpoint WCF su net.tcp (con base address su porta 808):</p>
<pre><code class="language-xml">&lt;configuration&gt;
  &lt;system.serviceModel&gt;
    &lt;services&gt;
      &lt;service name="Contoso.Services.OrdiniService" behaviorConfiguration="ServiceBehavior"&gt;
        &lt;host&gt;
          &lt;baseAddresses&gt;
            &lt;add baseAddress="net.tcp://localhost:808/Contoso/Ordini"/&gt;
          &lt;/baseAddresses&gt;
        &lt;/host&gt;
        &lt;endpoint address="" binding="netTcpBinding" contract="Contoso.Services.IOrdiniService"/&gt;
        &lt;endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange"/&gt;
      &lt;/service&gt;
    &lt;/services&gt;
    &lt;bindings&gt;
      &lt;netTcpBinding&gt;
        &lt;binding name="DefaultNetTcp" receiveTimeout="00:10:00" sendTimeout="00:01:00"&gt;
          &lt;security mode="Transport"&gt;
            &lt;transport clientCredentialType="Windows"/&gt;
          &lt;/security&gt;
        &lt;/binding&gt;
      &lt;/netTcpBinding&gt;
    &lt;/bindings&gt;
    &lt;behaviors&gt;
      &lt;serviceBehaviors&gt;
        &lt;behavior name="ServiceBehavior"&gt;
          &lt;serviceMetadata/&gt;
          &lt;serviceDebug includeExceptionDetailInFaults="false"/&gt;
        &lt;/behavior&gt;
      &lt;/serviceBehaviors&gt;
    &lt;/behaviors&gt;
  &lt;/system.serviceModel&gt;
&lt;/configuration&gt;
</code></pre>

<h2>Firewall: aprire solo le porte necessarie</h2>
<p>Assicurati che il firewall di Windows (e gli eventuali dispositivi perimetrali) consenta le connessioni in ingresso sulle porte TCP usate dal tuo servizio. Se usi la porta 808:</p>
<pre><code class="language-powershell">New-NetFirewallRule -DisplayName "WCF net.tcp 808" -Direction Inbound -Protocol TCP -LocalPort 808 -Action Allow
</code></pre>
<p>Per più porte (es. 4502‑4506):</p>
<pre><code class="language-powershell">New-NetFirewallRule -DisplayName "WCF net.tcp 4502-4506" -Direction Inbound -Protocol TCP -LocalPort 4502-4506 -Action Allow
</code></pre>

<h2>Tabella rapida: sintomo → causa → soluzione</h2>
<table>
  <thead>
    <tr>
      <th>Sintomo</th>
      <th>Causa probabile</th>
      <th>Risoluzione</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Net.Tcp Listener Adapter non presente in <em>services.msc</em></td>
      <td>Feature <strong>WCF Non‑HTTP Activation</strong> non installata</td>
      <td>Installa <code>WCF-NonHTTP-Activation45</code>, abilita WAS e IIS</td>
    </tr>
    <tr>
      <td>Errore di start dell’app WCF su IIS</td>
      <td>Protocollo <code>net.tcp</code> non abilitato per l’app/sito</td>
      <td>Imposta <em>Enabled Protocols</em> a <code>http,net.tcp</code> (o solo <code>net.tcp</code>)</td>
    </tr>
    <tr>
      <td>Nessun ascolto sulla porta configurata</td>
      <td>Binding net.tcp mancante o errato</td>
      <td>Aggiungi binding <code>net.tcp</code> con <code>808:*</code> (o porta specifica)</td>
    </tr>
    <tr>
      <td>Connessione rifiutata dal client</td>
      <td>Porta bloccata a livello firewall</td>
      <td>Apri le porte con <code>New-NetFirewallRule</code></td>
    </tr>
    <tr>
      <td>Errore “AddressAlreadyInUse”</td>
      <td>Conflitto con altro servizio sulla stessa porta</td>
      <td>Scegli un’altra porta o abilita/usa <strong>Port Sharing</strong></td>
    </tr>
  </tbody>
</table>

<h2>Verifiche e diagnostica consigliate</h2>
<ul>
  <li><strong>Feature installate</strong>:
    <pre><code class="language-powershell">Get-WindowsFeature WCF-NonHTTP-Activation45, WCF-Services45, WAS, Web-WebServer, Web-Asp-Net45 | Format-Table -Auto

Stato servizi:

Get-Service NetTcpActivator, NetTcpPortSharing, WAS

Binding IIS:

Import-Module WebAdministration
Get-WebBinding | Where-Object {$_.protocol -eq 'net.tcp'} | Format-Table bindingInformation, protocol, siteName

Porte in ascolto:

Get-NetTCPConnection -State Listen | Where-Object {$_.LocalPort -in 808,4502..4506} | Sort-Object LocalPort | Format-Table LocalAddress,LocalPort,OwningProcess

Event Viewer: controlla Windows Logs › System e i log applicativi di WAS e WCF sotto Applications and Services Logs › Microsoft › Windows per errori di attivazione/binding.

Script “one‑shot” di controllo ambiente

Questo script fa un check completo e segnala cosa manca perché net.tcp funzioni su IIS.

$issues = @()

1) Feature

$features = 'WCF-NonHTTP-Activation45','WCF-Services45','WAS','Web-WebServer','Web-Asp-Net45'
(Get-WindowsFeature $features) | ForEach-Object {
if (-not $.Installed) { $issues += "Feature mancante: $($.Name) ($($_.DisplayName))" }
}

2) Servizi

$svc = Get-Service NetTcpActivator, NetTcpPortSharing -ErrorAction SilentlyContinue
$svc | ForEach-Object {
if ($.Status -ne 'Running') { $issues += "Servizio non avviato: $($.Name) (stato: $($_.Status))" }
}
if (-not $svc) { $issues += "Servizi NetTcp non trovati: installare WCF Non-HTTP Activation" }

3) IIS: binding net.tcp

Import-Module WebAdministration -ErrorAction SilentlyContinue
$netTcpBindings = Get-WebBinding -ErrorAction SilentlyContinue | Where-Object protocol -eq 'net.tcp'
if (-not $netTcpBindings) { $issues += "Nessun binding net.tcp presente su IIS" }

4) Output

if ($issues.Count -eq 0) { "OK: ambiente pronto per WCF net.tcp su IIS" }
else { "Problemi rilevati:`n - " + ($issues -join "`n - ") } 

Errori tipici e relative soluzioni

“Il servizio ‘Net.Tcp Listener Adapter’ non esiste”

Installa WCF Non‑HTTP Activation e WAS; poi verifica Get-Service NetTcpActivator. Senza quella feature il servizio non compare in alcuna console.

“Protocollo non supportato” o applicazione che resta in “stopped”

Abilita net.tcp tra i protocolli dell’app/sito e aggiungi il binding net.tcp alla porta desiderata (808:* o altra). Ricorda che il binding si configura a livello di site e l’abilitazione protocollo a livello di application.

Timeout di connessione dal client WCF

Quasi sempre è il firewall. Apri la/e porta/e con New-NetFirewallRule o chiedi lo sblocco al team di rete. Se sei dietro un reverse proxy o un bilanciatore, verifica la mappatura delle porte TCP.

Conflitto di porte

Se un altro servizio usa la stessa porta, o cambi porta (ad es. da 808 a 809) o sfrutti il Port Sharing lasciando che NetTcpPortSharing coordini più endpoint sulla stessa porta. Controlla cosa ascolta con Get-NetTCPConnection -State Listen.

App configurata solo per HTTP

Nel web.config/app.config devono esistere baseAddress net.tcp:// e un endpoint con binding="netTcpBinding". Se manca, IIS non attiva net.tcp per quell’app.

Buone pratiche di sicurezza e gestione

  • Riduci la superficie: installa solo le feature necessarie (Non‑HTTP Activation e gli strumenti di gestione che ti servono).
  • Limita le porte: apri nel firewall solo le porte effettivamente usate dall’applicazione.
  • Transport security: per dati sensibili usa netTcpBinding con security mode="Transport" e autenticazione Windows o certificati.
  • Service account: esegui l’app sotto un account con privilegi minimi (ApplicationPoolIdentity o account dedicato).
  • Monitoring: raccogli eventi da WAS, WCF e dal tuo host; abilita tracing WCF solo per diagnostica mirata.

Rollback / disinstallazione (se necessario)

Per rimuovere le componenti WCF non‑HTTP e ripristinare un profilo minimo:

Uninstall-WindowsFeature WCF-NonHTTP-Activation45

Per disinstallare anche IIS e WAS (attenzione: impatta tutti i siti/servizi):

Uninstall-WindowsFeature Web-WebServer, WAS

Domande frequenti (FAQ)

Devo installare anche “HTTP Activation”? Non è obbligatorio per net.tcp puro; è utile se la stessa app espone endpoint HTTP/HTTPS (ad es. MEX via http o API rest parallele).

Serve sempre il Port Sharing? In IIS è fortemente consigliato perché consente a più app di usare la stessa porta net.tcp dietro al coordinamento di NetTcpPortSharing. In scenari self‑host puoi decidere di non usarlo, scegliendo porte univoche.

Posso evitare il riavvio del server? Quasi sempre è sufficiente riavviare WAS e i due servizi net.tcp. Alcune installazioni guidate però suggeriscono il riavvio: seguilo se richiesto.

Come testo rapidamente? Usa WcfTestClient.exe dal SDK oppure un client di prova con ChannelFactory<> puntando all’URL net.tcp://server:porta/percorso.

Riepilogo operativo

  • Installa WCF Non‑HTTP Activation e abilita WAS e TCP Port Sharing (da Server Manager, PowerShell o DISM).
  • Imposta e avvia i servizi NetTcpActivator e NetTcpPortSharing.
  • Su IIS: aggiungi binding net.tcp alla porta corretta e abilita il protocollo sull’app.
  • Apri le porte nel firewall usate dall’applicazione.
  • Verifica con gli script proposti e controlla i log di WAS/WCF.

Seguendo questa procedura, la tua applicazione WCF .NET 4.8 tornerà ad avviarsi regolarmente su Windows Server 2022 con il servizio Net.Tcp Listener Adapter presente e funzionante.


Appendice: guida completa passo‑passo (estesa)

  1. Raccogli le informazioni
    • Porta desiderata per net.tcp (es. 808 o un range dedicato).
    • Base address e endpoint del servizio (web.config/app.config).
  2. Installa le feature (uno dei tre metodi sopra).
  3. Allinea i servizi
    • Automatic per NetTcpActivator e NetTcpPortSharing.
    • Riavvia WAS se richiesto.
  4. Configura IIS
    • Aggiungi binding net.tcp con porta:*.
    • Imposta Enabled Protocols su http,net.tcp (o net.tcp).
  5. Configura l’app
    • Assicurati di avere baseAddress net.tcp:// e un endpoint netTcpBinding.
  6. Apri il firewall per le porte necessarie.
  7. Test
    • Get-NetTCPConnection -State Listen sulla porta.
    • Client WCF o WcfTestClient sull’URL net.tcp.

Appendice: esempi di configurazione IIS (apphost.config)

Estratto semplificato utile per comprendere dove finiscono i binding net.tcp a livello di sito:

&lt;site name="Default Web Site" id="1"&gt;
  &lt;bindings&gt;
    &lt;binding protocol="http" bindingInformation="*:80:" /&gt;
    &lt;binding protocol="net.tcp" bindingInformation="808:*" /&gt;
  &lt;/bindings&gt;
  &lt;application path="/" applicationPool="DefaultAppPool" enabledProtocols="http,net.tcp"&gt;
    &lt;virtualDirectory path="/" physicalPath="C:\inetpub\wwwroot" /&gt;
  &lt;/application&gt;
&lt;/site&gt;

Appendice: hardening e prestazioni net.tcp

  • Keep‑alive e timeouts: regola receiveTimeout/sendTimeout in base ai carichi; evita timeouts eccessivamente lunghi che tengono occupate le connessioni.
  • Concorrenza: usa ServiceThrottlingBehavior per limitare il numero di istanze/connessioni se necessario.
  • Dimensione messaggi: per payload ampi, aumenta maxReceivedMessageSize sul binding.
  • Log rotation: se abiliti tracing WCF, imposta dimensione/rotazione dei log per non saturare disco.

In conclusione: l’assenza del servizio Net.Tcp Listener Adapter su Windows Server 2022 non è un guasto di sistema, ma un set di feature non installate. Abilitando WCF Non‑HTTP Activation, WAS e il port sharing, configurando correttamente IIS e aprendo le porte necessarie, l’hosting WCF su net.tcp torna operativo e stabile.

Hai bisogno di una checklist stampabile o di uno script adattato al tuo standard aziendale? Copia gli snippet sopra e versionali nel tuo repository di automazione: ridurrai tempi di provisioning e variabilità tra ambienti.

Indice