Sto analizzando della documentazione per un proof-of-concept richiestomi da un cliente, le varie features implicano la presenza di un servizio WCF ma la parte più  “strana” è il fatto che il servizio possa essere invocato da dei micro-dispositivi custom sparsi in tutto il territorio, i quali, per una lunga serie di motivi, devono utilizzare un firmware proprietario.
Parlando del requisito con il team che si occuperà della parte firmware la risposta che ho avuto è: Il firmware è in grado di invocare una url ed eventualmente parsificarne il risultato ottenuto.
Ci sono varie soluzioni per arrivare al risultato, ad esempio si potrebbe creare una pagina web, fare il parsing dei parametri passati e invocare la parte che elabora le informazioni come fa la parte di servizio web consumata dall’applicativo SilverLight che rappresenta l’altro client del servizio WCF.
Riflettendo su possibili alternative mi sono ricordato di una interessante novità introdotta in WCF col Fx 3.5: il webHttpBinding.
WebHttpBinding consente l’esposizione di EndPoints che possono essere invocati via Http GET passando i parametri nella query string.

Esempio:

[ServiceContract]
public interface IMyService
{
  [OperationContract]
  [WebGet(UriTemplate="register?id={id}&name={name}&value={value}")]
  bool Register(int id, string name,string value);
}

public class MyService : IMyService
{
  public bool Register(int id, string name, string value)
  {
    bool status = false;
    if (id > 0)
    {
      //Do your stuff here...
      status=true;
    }
    return status;
  }
}

WebGet è l’attributo che indica com’è raggiungibile l’operazione e come sia formattata la relativa Uri attraverso il parametro UriTemplate, oltre a WebGet esiste anche WebInvoke che consente l’uso di altre azioni (POST,PUT,DELETE…)

A questo punto, è necessario agire sul file web.config indicando l’uso di webHttpBinding, notate come sia necessario utilizzare un custom behavior:

<system.serviceModel>
   <services>
     <service name="Service.MyService" behaviorConfiguration="ServiceBehavior">
       <endpoint address="" binding="webHttpBinding"
                            contract="Contracts.IMyService"
                            behaviorConfiguration="webBehavior" />
       <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
     </service>
   </services>
   <behaviors>
     <endpointBehaviors>
       <behavior name="webBehavior">
         <webHttp/>
       </behavior>
     </endpointBehaviors>
     <serviceBehaviors>
       <behavior name="ServiceBehavior">
         <serviceMetadata httpGetEnabled="true"/>
         <serviceDebug includeExceptionDetailInFaults="false"/>
       </behavior>
     </serviceBehaviors>
   </behaviors>
 </system.serviceModel>

Ospitato il servizio in IIS, per invocare il metodo è sufficiente aprire il browser e invocare la relativa URI:

image

Questa soluzione copre esattamente la mia necessità, spero possa essere utile anche a voi.

Technorati Tags: ,