Un’ approccio introdotto in WCF 4.0 è la “Convention Over Configuration”. Sostanzialmente essa permette di assegnare una configurazione predefinita ad un endpoint in assenza di una configurazione esplicita (cosa impossibile in WCF 3.x). Ciò avviene tramite la definizione di un mapping tra lo schema/protocollo (es. http, tcp etc.) e le varie tipologie di binding (es. BasicHttpBinding, NetTcpBinding etc.) all’interno del file:
%WINDIR%\Microsoft.NET\Framework\v4.0.30319\Config\machine.config.comments
<protocolMapping>
<clear />
<add scheme="http" binding="basicHttpBinding" bindingConfiguration="" />
<add scheme="net.tcp" binding="netTcpBinding" bindingConfiguration="" />
<add scheme="net.pipe" binding="netNamedPipeBinding" bindingConfiguration="" />
<add scheme="net.msmq" binding="netMsmqBinding" bindingConfiguration="" />
</protocolMapping>
Volendo verificare la cosa, creiamo un’ interfaccia di prova
[ServiceContract]
public interface IDummyService
{
[OperationContract(IsOneWay=true)]
void DoNothing();
}
Puntualizziamo il fatto che la scelta di impostare l’operation contract come “OneWay” deriva dal fatto che un contratto esposto da un endpoint che utilizza NetMsmqBinding può supportare solo operazioni one-way. Implementiamo quindi l’interfaccia IDummyService...
public class MyDummyService : IDummyService
{
public void DoNothing() { }
}
Costruiamo un test per verificare quanto asserito, ponendo attenzione a non specificare alcuna configurazione per gli endpoint:
ServiceHost host = new ServiceHost(typeof(MyDummyService),
new Uri("http://localhost:8080/MyDummyService"),
new Uri("net.tcp://localhost:8081/MyDummyService"),
new Uri("net.pipe://localhost/MyDummyService"),
new Uri("net.msmq://localhost/private/MyDummyService"));
host.Open();
Assert.AreEqual(4, host.Description.Endpoints.Count);
Assert.IsTrue(host.Description.Endpoints[0].Binding is BasicHttpBinding);
Assert.IsTrue(host.Description.Endpoints[1].Binding is NetTcpBinding);
Assert.IsTrue(host.Description.Endpoints[2].Binding is NetNamedPipeBinding);
Assert.IsTrue(host.Description.Endpoints[3].Binding is NetMsmqBinding);
Verde!
Ovviamente, se ne abbiamo la necessità, possiamo effettuare l’override di questi mappings sia a livello di machine che a livello di application. Ad esempio, se specificassimo la seguente configurazione nell’app.config…
<configuration>
<system.serviceModel>
<protocolMapping>
<add scheme="http" binding="webHttpBinding"/>
</protocolMapping>
</system.serviceModel>
</configuration>
…il test precedente fallirebbe poiché lo schema http è stato assegnato al WebHttpBinding e non più al BasicHttpBinding. Invece, il seguente test avrebbe successo
ServiceHost host = new ServiceHost(typeof(MyDummyService),new Uri("http://localhost:8080/MyDummyService"));
host.Open();
Assert.IsTrue(host.Description.Endpoints[0].Binding is WebHttpBinding);
Per avere più informazioni riguardo al funzionamento di questa feature e delle altre novità di WCF 4.0 rimando a questo link MSDN:
http://msdn.microsoft.com/en-us/library/ee354381.aspx (A Developer's Introduction to Windows Communication Foundation 4)