Non tutti gli sviluppatori che lavorano con ASP.NET conoscono l'esistenza dell'architettura WCF: la sigla è acronimo di Windows Communication Foundation, un framework dedicato allo sviluppo di applicazioni web service-oriented lanciato da Microsoft parecchi anni fa - ai tempi del .NET Framework 3.0 - in sostituzione del precedente approccio basato sulle fin troppo note (e ormai antidiluviane) pagine ASMX.
Per comprendere appieno la differenza che intercorre tra ASMX e WCF è opportuno leggere questo eccellente articolo di Keith Elder che spiega molto bene la diffenza di vedute dei due sistemi, evidenziando le limitazioni del primo e sottolineando le potenzialità offerte dal secondo. Un endorsement senz'altro meritato, ma inevitabilmente figlio del suo tempo: ottobre 2008.
Senza nulla togliere alla validità delle conclusioni di Keith, possiamo ormai dire che anche WCF è ormai una architettura piuttosto datata, soprattutto rispetto alle funzionalità offerte in ottica REST: queste ultime sono state rese obsolete dalla stessa Microsoft con lo sviluppo del framework ASP.NET Web API e poi, più recentemente, con l'avvento di MVC6 / ASP.NET Core. Nonostante questo, WCF resta ad oggi - nell'ambito dello sviluppo in ambiente Windows - l'architettura più semplice per implementare Web Service SOAP, i quali sono peraltro ancora molto utilizzati in ambito business in Italia come nel resto del mondo. Per maggiori informazioni su WCF potete leggere questo interessante articolo su MDSN al riguardo.
Finita questa lunga premessa, veniamo al sodo! Se vi siete imbattuti in questo articolo è probabile che vi siate scontrati con un problema piuttosto comune che affligge tutti gli sviluppatori e/o amministratori di rete al momento di installare il loro primo servizio WFC su una macchina Windows Server 2012 con Internet Information Services 8 (IIS) o superiore. Una volta effettuato il deploy, al momento di lanciare la pagina Service.svc, viene restituito il più classico degli errori HTTP:
404 - File or directory not found.
The resource you are looking for might have been removed, had its name changed, or is temporarily unavailable.
Le cause di questo 404 sono ovviamente dovute al mancato mapping dell'handler necessario per interpretare questo tipo di chiamate.
Per risolvere il problema esistono varie strade, molte delle quali - descritte anche in altri siti - prevedono l'esecuzione manuale del comando ServiceModelReg.exe: si tratta di procedure senza dubbio valide ma che rischiano di non funzionare - o di creare altri problemi - se la nostra macchina di sviluppo ha una configurazione particolarmente complessa.
Il metodo di risoluzione che propongo di seguito è leggermente più lungo ma ha il pregio di risolvere il problema in modo più sicuro e controllato.
- Aprite l'interfaccia Server Manager per la gestione della macchina, solitamente presente sia nella Task Bar che all'interno del menu Start.
- Andate nella Dashboard e selezionate Add Role or Feature, così da aprire l'apposito Wizard.
- Selezionate il tipo di installazione Role-based or Feature-based e il server su cui desiderate intervenire, ovvero il server locale/local server.
- Andate avanti fino alla sezione Features: una volta lì, espandete il nodo .NET Framework 3.5 Features e/o il nodo .NET Framework 3.5 Features, a seconda di cosa avete installato: nel caso in cui li abbiate entrambi, è opportuno applicare la modifica su entrambi.
- Espandete la sezione WCF Services (solo se presente), quindi selezionate HTTP Activation (cfr. screenshot di seguito).
- Proseguite fino a completare il Wizard, quindi fate click su Install.
Al termine dell'installazione, potrete eseguire il vostro WCF Service senza più incorrere nell'errore 404.
Per il momento è tutto: felice WCF!
P.S.: Se non avete mai realizzato un Web Service WCF prima d'ora e volete cimentarvi, vi consigliamo di leggere questa guida che spiega tutti i passaggi necessari.