2012-12-06 10 views
7

Mam usługę WCF, którą próbuję skonfigurować, aby udostępnić 2 punkty końcowe, odnoszące się do różnych funkcji pod różnymi adresami URL.Usługa WCF prezentująca 2 punkty końcowe na 2 różnych umowach serwisowych

Co chcę mieć jest Service1, odsłaniając metody A, B, C i Usługa2, odsłaniając metody D, E. Chcę móc przeglądać zarówno localhost/WebServiceName/Service1/Serwis .svc i localhost/WebServiceName/Service2/Service.svc.

Inne aplikacje odwoływania się localhost/WebServiceName/Service1/Service.svc powinni zobaczyć tylko interfejs zawierający metody A, B i C. Nie powinno się zobaczyć coś odnośnie Usługa2 interfejsu. I tak samo dla Service2.

Do tej pory zdefiniowane dwa interfejsy w moim usług WCF, I_Service1 i I_Service2.

Dodałem dwa punkty końcowe w moim web.config tak:

<endpoint address="http://localhost/WebServiceName/Service1/" binding="wsHttpBinding" contract="WebServiceName.I_Service1" bindingConfiguration="Binding1" /> 
<endpoint address="http://localhost/WebServiceName/Service2/" binding="wsHttpBinding" contract="WebServiceName.I_Service2" bindingConfiguration="Binding2" /> 

Propozycja wykorzystania pełnego adresu w enpoint pochodzi stąd: Multiple endpoints under IIS

ale nadal nie mogę przeglądać localhost/WebServiceName/Service1/Service.svc. Otrzymuję:

Description: HTTP 404. The resource you are looking for (or one of its dependencies) could have been removed, had its name changed, or is temporarily unavailable. Please review the following URL and make sure that it is spelled correctly. 

mogę z powodzeniem przeglądać localhost/WebServiceName/Service.svc i WSDL zawiera metody A, B, C, D, E. Ale to powinno być złego w zachowaniu chcę.

Czy jest coś, co przegapiłem?

AKTUALIZACJA: Po tym artykule http://allen-conway-dotnet.blogspot.ro/2011/09/exposing-multiple-binding-types-for.html Stworzyłem dwie różne usługi kontraktowe dla tych punktów końcowych. Ale obecnie przeglądam tylko Service1. Najwyraźniej usługa Service2 (pojawiają się problemy związane z błędem HTTP 404).

konfiguracja wygląda następująco:

<services> 
    <service behaviorConfiguration="WebServiceName.ServiceBehavior1" name="WebServiceName.Service1"> 
    <endpoint address="" binding="wsHttpBinding" bindingConfiguration="Binding1" 
    contract="WebServiceName.I_Service1" /> 
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
    <host> 
     <baseAddresses> 
     <add baseAddress="http://localhost/WebServiceName/Service1/Service.svc" /> 
     </baseAddresses> 
    </host> 
    </service> 
    <service behaviorConfiguration="WebServiceName.ServiceBehavior2" name="WebServiceName.Service2"> 
    <endpoint address="" binding="wsHttpBinding" bindingConfiguration="Binding1" 
    contract="WebServiceName.I_Service2" /> 
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
    <host> 
     <baseAddresses> 
     <add baseAddress="http://localhost/WebServiceName/Service2/Service.svc" /> 
     </baseAddresses> 
    </host> 
    </service> 
    </services> 

Odpowiedz

1

W tej chwili moim rozwiązaniem tego problemu było włączenie dwóch plików .svc w moim serwisie, aby oddzielić dwa interfejsy. Takich, mam localhost/WebServiceName/Service1.svc i localhost/WebServiceName/Service2.svc.

Dzięki konfiguracji punktów końcowych

<services> 
    <service behaviorConfiguration="WebServiceName.ServiceBehavior1" name="WebServiceName.Service1"> 
    <endpoint address="" binding="wsHttpBinding" bindingConfiguration="Binding1" 
    contract="WebServiceName.I_Service1" /> 
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
    <host> 
     <baseAddresses> 
     <add baseAddress="http://localhost/WebServiceName/Service1.svc" /> 
     </baseAddresses> 
    </host> 
    </service> 
    <service behaviorConfiguration="WebServiceName.ServiceBehavior2" name="WebServiceName.Service2"> 
    <endpoint address="" binding="wsHttpBinding" bindingConfiguration="Binding2" 
    contract="WebServiceName.I_Service2" /> 
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
    <host> 
     <baseAddresses> 
     <add baseAddress="http://localhost/WebServiceName/Service1.svc" /> 
     </baseAddresses> 
    </host> 
    </service> 
    </services> 

To rozwiązanie nie jest konieczne najlepszy (jeśli klient naprawdę chce, to może okaże się, że usługa ta naraża 2 różne interfejsy, ale mogę zabezpieczyć je z różnych poświadczeń/tokeny). Ale w tej chwili pójdę z tym.

1

Starałem się zrobić rzeczy, które opisałeś. Wszystko to się udaje. Nie bądź zły, jeśli niektóre kroki są dla ciebie oczywiste. A więc:

  1. Utwórz projekt aplikacji usług WCF.
  2. Dodaj dwie pozycje usługi WCF (domyślnie zostanie utworzony interfejs i plik svc).
  3. Utwórz projekt aplikacji sieci Web.
  4. Dodaj dwa odwołania do usług (kliknij prawym przyciskiem myszy projekt aplikacji sieci Web ==> Dodaj odwołanie do usługi) za pomocą przycisku "Odkryj" (powinny być widoczne dwie usługi internetowe).
  5. To wszystko.

Domyślnie mam następujący Web.config w projekcie aplikacji sieci Web:

 <system.serviceModel> 
<bindings> 
    <basicHttpBinding> 
    <binding name="BasicHttpBinding_IService1" closeTimeout="00:01:00" 
     openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" 
     allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" 
     maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536" 
     messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" 
     useDefaultWebProxy="true"> 
     <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" 
     maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
     <security mode="None"> 
     <transport clientCredentialType="None" proxyCredentialType="None" 
      realm="" /> 
     <message clientCredentialType="UserName" algorithmSuite="Default" /> 
     </security> 
    </binding> 
    <binding name="BasicHttpBinding_IService2" closeTimeout="00:01:00" 
     openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" 
     allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" 
     maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536" 
     messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" 
     useDefaultWebProxy="true"> 
     <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" 
     maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
     <security mode="None"> 
     <transport clientCredentialType="None" proxyCredentialType="None" 
      realm="" /> 
     <message clientCredentialType="UserName" algorithmSuite="Default" /> 
     </security> 
    </binding> 
    </basicHttpBinding> 
</bindings> 
<client> 
    <endpoint address="http://localhost:3597/Service1.svc" binding="basicHttpBinding" 
    bindingConfiguration="BasicHttpBinding_IService1" contract="ServiceReference1.IService1" 
    name="BasicHttpBinding_IService1" /> 
    <endpoint address="http://localhost:3597/Service2.svc" binding="basicHttpBinding" 
    bindingConfiguration="BasicHttpBinding_IService2" contract="ServiceReference2.IService2" 
    name="BasicHttpBinding_IService2" /> 
</client> 

Można spróbować odbudować projekt WCF i aktualizować WebReferences.

+2

Nie ma nic złego w stwierdzeniu oczywistych kroków; przez większość czasu są tymi, których zapominamy. Niemniej jednak, moje pytanie dotyczy tego, jak skonfigurować pojedynczą usługę sieci Web z 2 punktami końcowymi, a nie dwoma różnymi usługami sieciowymi. Również część konfiguracyjna dotyczy tego, co powinno być skonfigurowane w tym Web.config Web Service, a nie w pliku web.config lub app.config aplikacji, które go odwołują. –

3

Sposób Zawsze odbywa się to w sposób następujący: „ustawiony pojedynczy adres bazowy” dla usługi i określić punkt końcowy adresów jako inny tekst dołączany na tego adresu bazowego ...

<service name="MyNamespace.MyService"> 
    <endpoint address="FirstEndpointAddress" binding="netTcpBinding" 
     name="FirstEndpointName" 
     contract="MyNamespace.FirstEndpointContract" /> 
    <endpoint address="SecondEndpointAddress" binding="netTcpBinding" 
     name="SecondEndpointName" 
     contract="MyNamespace.SecondEndpointContract" /> 
    <host> 
     <baseAddresses> 
     <add baseAddress="net.tcp://localhost:8733/MyBaseAddress" /> 
     </baseAddresses> 
    </host> 
    </service> 

Więc w twoim przypadku adres bazowy może być localhost/WebServiceName, a adres punktu końcowego dla punktu końcowego 1 może być Service1/Service.svc. Podobnie dla punktu końcowego 2 może to być Service2/Service.svc. Widzę, że podążyłeś za radą, by umieścić pełny adres w adresie punktu końcowego, ale mogę tylko powiedzieć, że zrobiłem to w ten sposób z sukcesem.

+0

Nawet przy takim podejściu otrzymuję błąd HTTP 404 dla localhost: 8733/MyBaseAddress/FirstEndpointName/Service.svc (mimo że próbuję dodać odwołanie do usługi w kliencie widocznie localhost: 8733/MyBaseAddress/Service.svc jest widoczne podczas odkrywanie usług, z obydwoma interfejsami, co w moim przypadku jest złe). Czy może występować błąd konfiguracji pod względem IIS, a nie web.config? Próbowałem wygenerować dwa wirtualne katalogi dla dwóch punktów końcowych, ale oba wirtualne katalogi są bindowane do interfejsu pierwszego punktu końcowego. –

+1

Jeśli nie podałeś jednego z punktów końcowych adresu "FirstEndpointName/Service.svc", nie spodziewałbym się adresu, który używałeś do pracy. Pamiętaj, że nazwy punktów końcowych i adresy punktów końcowych są różne. – Martin

+0

Ostatecznym adres się localhost: 8733/MyBaseAddress/Service.svc/FirstEndpointAddress i localhost: 8733/MyBaseAddress/Service.svc/SecondEndpointAddress W kod klienta var svcClient = nowy ServiceReference1.ServiceClient ("SecondEndpointName"); – hB0

Powiązane problemy