2009-04-06 5 views

risposta

50

Per prima cosa è necessario chiarire cos'è un servizio. Si intende un singolo endpoint o più endpoint nello stesso host?

Supponendo che si intenda un singolo endpoint, quindi sì, ma con un po 'di lavoro. Un endpoint può implementare solo una singola interfaccia; così quello che dovete fare è combinare tutte le interfacce si desidera implementare in un'unica interfaccia

public interface IMyInterface : IInterface1, IInterface2 

e quindi implementare tutti all'interno della vostra classe di implementazione. Ciò che non si può fare è avere interfacce multiple e più implementazioni magicamente fondersi in un singolo endpoint.

+0

Grazie, è esattamente quello che stavo chiedendo. –

+0

Semplice, intelligente! Soluzione brillante +1 da me –

+0

Ho due interfacce, devo fare due servizi? posso usare due interfacce ognuna con un endpoint nello stesso servizio? –

5

con WCF, è possibile:

  • hanno una classe di implementazione del servizio che implementa le interfacce di servizi multipli
  • hanno una classe di implementazione del servizio esposte attraverso molteplici punti finali, per esempio un endpoint di servizio che utilizza BasicHttpBinding per la massima interoperabilità e un altro endpoint che utilizza NetTcpBinding per le massime prestazioni (con i client WCF).
3

Ecco come è possibile esporre la stessa interfaccia su due diversi endpoint in App.Config se è quello che stai chiedendo.

<service name="Service1">  
    <endpoint address="http://localhost:8001/service1.asmx" binding="basicHttpBinding" contract="IService" /> 
</service> 
<service name="Service2">  
    <endpoint address="http://localhost:8002/service2.asmx" binding="basicHttpBinding" contract="IService" /> 
</service> 
3

Se la classe di implementazione diventa troppo grande (come la mia), provare a implementare la super-interfaccia in una classe parziale. È possibile inserire un'implementazione dell'interfaccia in un unico file. È semplicemente una convenzione, ma potrebbe essere utile in seguito.

21

Quanto segue sembra più vicino alla meta originale e non comporta una grande interfaccia ...

più endpoint in un singolo ListenUri: http://msdn.microsoft.com/en-us/library/aa395210.aspx


Il campione linkato sopra spiega che si tratta di possibile avere più endpoint registrati allo stesso indirizzo fisico (listenUri), ognuno implementando un'interfaccia diversa (contratto), ad esempio:

<endpoint address="urn:Stuff" 
     binding="wsHttpBinding" 
     contract="Microsoft.ServiceModel.Samples.ICalculator" 
     listenUri="http://localhost/servicemodelsamples/service.svc" /> 
<endpoint address="urn:Stuff" 
     binding="wsHttpBinding" 
     contract="Microsoft.ServiceModel.Samples.IEcho" 
     listenUri="http://localhost/servicemodelsamples/service.svc" /> 
<endpoint address="urn:OtherEcho" 
     binding="wsHttpBinding" 
     contract="Microsoft.ServiceModel.Samples.IEcho" 
     listenUri="http://localhost/servicemodelsamples/service.svc" /> 

Ciò è possibile perché i messaggi in entrata vengono indirizzati all'endpoint appropriato in base a una combinazione di filtri indirizzo e contratto.

+1

In realtà ho smesso di leggere quando ho visto una buona risposta che potrei usare. Vorrei aver visto la tua risposta in tempo. +1 perché questa è una risposta ancora migliore, anche se posso pensare ai casi adatti alla risposta accettata. –

+1

Questa è una soluzione molto migliore per il problema che ho riscontrato. Mi ha permesso di avere due diversi tipi di serializzatori, necessari per la mia soluzione. –