Ho un set di Contratti di servizio che suddividono la mia interfaccia di servizio in blocchi di funzionalità correlate. Attualmente sto implementando tutti i contratti usando una singola classe di servizio (potrebbe volerli suddividere in seguito, ma per ora è sufficiente la singola classe di servizio).WCF Servizio ospitato da IIS più Contratti di servizio implementati da un singolo servizio: come posso condividere uri tra endpoint tramite config
Sto cercando di utilizzare configurare gli endpoint utilizzando un file di configurazione (anziché tramite il codice). Il problema è che ho un ServiceActivationException
perché i due endpoint (uno per ogni contratto di servizio) stanno cercando di ascoltare sullo stesso uri. I dettagli di eccezione dicono che per raggiungere questo obiettivo i due endpoint devono condividere l'oggetto vincolante, il che ha senso, ma non riesco a capire come farlo tramite config (non ho provato a farlo via codice come sto ospitando in IIS ma Posso immaginare che sia un semplice esercizio configurare in codice).
che segue è la configurazione Attualmente sto usando (questo è ancora dev quindi non sono attualmente preoccupati per problemi di sicurezza ecc, che alcune di queste impostazioni possono esporre):
<system.serviceModel>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
<services>
<service name="CDC.WebPortal.MidTier.MidTierAccessService"
behaviorConfiguration="MidTierServiceBehaviour" >
<endpoint address=""
binding="webHttpBinding"
bindingConfiguration="RestBindingConfiguration"
contract="****************************.IProductService" />
<endpoint address=""
binding="webHttpBinding"
bindingConfiguration="RestBindingConfiguration"
contract="****************************.ICategoryService" />
<endpoint address="mex" binding="mexHttpBinding"
contract="IMetadataExchange" />
</service>
</services>
<bindings>
<webHttpBinding>
<binding name="RestBindingConfiguration"
maxReceivedMessageSize="104857600">
<readerQuotas maxStringContentLength="104857600"/>
</binding>
</webHttpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="MidTierServiceBehaviour">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
</behaviors>
Quindi la mia domanda è: come posso condividere questo legame tra i due endpoint?
I commenti in this SO question suggeriscono che potrebbe non essere in grado di farlo, ma non credo che sia corretto.
UPDATE 1 Secondo this MS publication quello che sto facendo dovrebbe essere ok ...
UPDATE2 Ecco il contenuto del file SVC se aiuta:
<%@ ServiceHost Language="VB" Debug="true"
Service="*********************.MidTierAccessService"
Factory="Microsoft.ServiceModel.Web.WebServiceHost2Factory" %>
UPDATE 3 Ecco il dettaglio delle eccezioni:
Un instante vincolante ce è già stato associato ad ascoltare URI '********************'. Se due endpoint vogliono condividere lo stesso ListenUri, devono anche condividere la stessa istanza di oggetto vincolante. I due endpoint in conflitto sono stati specificati nelle chiamate AddServiceEndpoint(), in un file di configurazione o in una combinazione di AddServiceEndpoint() e config.
AGGIORNAMENTO 4 Ok ho perso this prima, affermando "È necessario utilizzare indirizzi relativi quando si espone più di un punto finale per un particolare servizio .svc". La causa di questo è qualcosa che ha a che fare con la directory virtuale IIS che determina l'indirizzo di base del servizio, qualcuno può spiegarlo in modo un po 'più dettagliato, cioè perché IIS ha bisogno di indirizzamento relativo per ogni contratto.
+1 per "vera maga" – dan
@dan: lol: D Grazie. – jrista