Configurazione Semplificare WCF
-
25-09-2019 - |
Domanda
Ho un sacco di servizi WCF self-hosted. bel lavoro di tutto, ma io sono cercare modi per normalizzare / semplificare la configurazione risultante. Ho semplificato il più possibile, ma non sono ancora contento. Attualmente, il mio aspetto di configurazione di questo tipo:
<system.serviceModel>
<bindings>
<netTcpBinding>
<binding name="BindingConfiguration" ...>
...
</binding>
</netTcpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="ServiceBehavior">
...
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<service behaviorConfiguration="ServiceBehavior" name="Name1">
<endpoint address="net.tcp://localhost:8080/name1" binding="netTcpBinding" bindingConfiguration="BindingConfiguration" contract="Contract1">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
</service>
<service behaviorConfiguration="ServiceBehavior" name="Name2">
<endpoint address="net.tcp://localhost:8080/name2" binding="netTcpBinding" bindingConfiguration="BindingConfiguration" contract="Contract2">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
</service>
...
</services>
</system.serviceModel>
In tutto, ho 6 servizi in modo che sia ripetitivo. Idealmente, mi piacerebbe:
- Per specificare "localhost: 8080" solo una volta e condividere tra tutti i servizi, e specificare solo la differenza ( "nome1" o "nome2")
- Specificare le informazioni di identità solo una volta e condividere tra tutte le definizioni di servizio
Per il mio primo punto, ho consapevole di indirizzi di base , ma che funziona solo a livello di servizio, e non tra servizi separati. Al secondo punto, ho provato a spostare le informazioni di identità in un comportamento di endpoint, ma che non sembra essere supportato.
C'è qualcosa che posso fare per semplificare questa configurazione? o è la mia unica opzione per passare a un approccio di configurazione basato su codice?
Soluzione
Purtroppo, come avete notato voi stessi - il concetto indirizzo di base è solo a livello per-service -. Quindi se avete un sacco di punti finali per un determinato servizio, quindi è possibile utilizzarlo
L'unica opzione che realmente avrebbe dovuto è quello di utilizzare altri mezzi di configurare il vostro indirizzo di base, e quindi utilizzare tale per creare gli endpoint di servizio nel codice. Se si auto-host vostro servizio, si potrebbe fare questo nel codice ospite, prima di chiamare ServiceHost.Open()
- Se ospitate in IIS, si dovrà creare il proprio ServiceHostFactory
personalizzato che fa tutto questo setup, e quindi utilizzare tale servizio di accoglienza personalizzato fabbrica per creare i padroni di servizio in IIS.
Sia è fattibile con uno sforzo gestibile - domanda è se questo è vale la pena per te, ma non possiamo decidere che al tuo posto ...