Mam zestaw umów serwisowych, które dzielą mój interfejs usług na fragmenty powiązanych funkcji. Obecnie wdrażam wszystkie kontrakty przy użyciu jednej klasy usług (można je podzielić później, ale na razie wystarczająca jest jedna klasa usług).Usługa WCF IIS obsługuje wiele umów serwisowych realizowanych przez pojedynczą usługę - jak udostępnić URI między punktami końcowymi za pomocą konfiguracji
Próbuję użyć konfiguracji punktów końcowych za pomocą pliku konfiguracyjnego (w przeciwieństwie do kodu za pośrednictwem kodu). Problem polega na tym, że otrzymuję ServiceActivationException
, ponieważ dwa punkty końcowe (jeden dla każdej umowy serwisowej) próbują nasłuchiwać na tym samym komputerze. Szczegóły wyjątku mówią, że aby to osiągnąć, oba punkty końcowe muszą współdzielić obiekt wiązania, co ma sens, ale nie mogę wymyślić, jak to zrobić przez config (nie próbowałem tego robić przez kod, ponieważ jestem hostem w IIS, ale Mogę sobie wyobrazić, że jest to proste ćwiczenie do konfiguracji w kodzie).
Poniżej znajduje się config Obecnie używam (jest to nadal dev, więc nie jestem obecnie martwi się o kwestie bezpieczeństwa itp, że niektóre z tych ustawień może narazić):
<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>
Moje pytanie brzmi: jak udostępnić to powiązanie między dwoma punktami końcowymi?
Komentarze w this SO question sugerują, że mogę nie być w stanie tego zrobić, ale nie wierzę, że to prawda.
UPDATE 1 Według this MS publication co robię powinno być ok ...
Update2 Oto zawartość pliku SVC, czy to pomaga:
<%@ ServiceHost Language="VB" Debug="true"
Service="*********************.MidTierAccessService"
Factory="Microsoft.ServiceModel.Web.WebServiceHost2Factory" %>
UPDATE 3 Oto szczegóły wyjątku:
Wiążące instan ce został już powiązany z odsłuchaniem URI "********************". Jeśli dwa punkty końcowe chcą współużytkować tę samą metodę ListenUri, muszą one również współużytkować tę samą instancję obiektu wiążącego, . Dwa będące w konflikcie punkty końcowe zostały określone w wywołaniach AddServiceEndpoint(), w pliku konfiguracyjnym lub w połączeniu z AddServiceEndpoint() i config.
UPDATE 4 Ok Tęskniłem this wcześniej, stwierdzając „Trzeba będzie używać adresów względnych podczas wystawiania więcej niż jeden punkt końcowy dla danej usługi .svc”. Przyczyna tego leży w związku z katalogiem wirtualnym IIS określającym adres bazowy usługi, czy ktoś może wyjaśnić to nieco bardziej szczegółowo, tj. Dlaczego usługi IIS potrzebują względnego adresowania dla każdej umowy.
+1 za "prawdziwą czarodziejkę" – dan
@dan: lol: D Dzięki. – jrista