2012-12-06 5 views
7

Ich habe einen WCF-Dienst, den ich zu konfigurieren versuche, so dass er 2 Endpunkte unter Bezug auf verschiedene Funktionen unter verschiedenen URLs verfügbar macht.WCF-Dienst mit 2 Endpunkten bei 2 verschiedenen Serviceverträgen

Was ich haben will ist Dienste1, Methoden A aussetzt, B, C und Service2, Belichtungsverfahren D, E. Ich möchte sowohl durchsuchen können localhost/Webservice/Dienste1/Dienstleistung .svc und localhost/WebServiceName/Service2/Service.svc.

Andere Anwendungen Referenzierung localhost/Webservice/Dienste1/Service.svc sollte nur die Schnittstelle sehen, die Methoden A, B und C. Sie sollten nicht sehen, etwas in Bezug auf Service2 Schnittstelle. Und für Service2 ebenfalls.

Bisher habe ich definiert zwei Schnittstellen in meinem WCF-Dienst, I_Service1 und I_Service2.

Ich habe zwei Endpunkte in meinem web.config hinzugefügt wie so:

<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" /> 

Der Vorschlag in der enpoint vollständige Anschrift des Verwendens von hier kommt: Multiple endpoints under IIS

Aber dennoch kann ich nicht durchsuchen localhost/WebServiceName/Service1/Service.svc. Ich erhalte:

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. 

ich erfolgreich localhost/Webservice/Service.svc und die WSDL-Datei enthält ein Verfahren blättern, B, C, D, E. Dies sollte aber im Verhalten falsch ich will.

Gibt es etwas, das ich verpasst habe?

UPDATE: Nach diesem Artikel http://allen-conway-dotnet.blogspot.ro/2011/09/exposing-multiple-binding-types-for.html habe ich zwei verschiedene Vertragsdienste für diese Endpunkte erstellt. Aber momentan bin ich nur Service1, wenn ich es suche. Service2 ist anscheinend nicht vorhanden (Probleme mit HTTP 404-Fehlern werden angezeigt).

Die Konfiguration sieht so aus:

<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> 

Antwort

1

Im Moment bestand meine Lösung für dieses Problem darin, zwei .svc-Dateien in meinen Webservice zu integrieren, um die beiden Schnittstellen zu trennen. So habe ich localhost/WebServiceName/Service1.svc und localhost/WebServiceName/Service2.svc.

Mit der Endpunktkonfiguration

<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> 

Diese Lösung ist nicht notwendig, die beste (wenn ein Kunde wirklich will, kann er feststellen, dass dieser Service 2 verschiedene Schnittstellen macht, aber ich kann sie mit anderen Anmeldeinformationen sichern/Token). Aber im Moment werde ich damit gehen.

1

Ich versuchte, die Sache zu machen, die Sie beschrieben. All dies gelingt. Bitte sei nicht sauer, wenn einige Schritte für dich offensichtlich sind. So:

  1. Erstellen Sie WCF-Serviceanwendungsprojekt.
  2. Fügen Sie zwei WCF-Dienstelemente hinzu (standardmäßig wird die Schnittstelle create und die svc-Datei erstellt).
  3. Erstellen Sie ein Webanwendungsprojekt.
  4. Fügen Sie zwei Service-Referenzen hinzu (klicken Sie mit der rechten Maustaste auf Web-App-Projekt ==> Service-Referenz hinzufügen), indem Sie die Schaltfläche "Entdecken" verwenden (zwei Web-Services sollten sichtbar sein).
  5. Das ist alles.

standardmäßig bekam ich folgende Web.config in webanwendungsprojekt:

 <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> 

Sie können versuchen, WCF-Projekt und aktualisieren WebReferences umzubauen.

+2

Es ist nichts falsch daran, offensichtliche Schritte zu sagen; die meiste Zeit sind sie diejenigen, die wir vergessen. Nichtsdestotrotz geht es in meiner Frage darum, wie man einen einzelnen Web-Service mit zwei Endpunkten konfiguriert, nicht mit zwei verschiedenen Web-Services. Der Konfigurationsteil beschreibt außerdem, was in diesem Webdienst web.config, nicht in der Datei web.config oder app.config von Anwendungen, die darauf verweisen, konfiguriert werden sollte. –

3

So wie ich das immer getan haben, ist wie folgt: eine einzige „Basisadresse“ für den Dienst eingestellt, und geben Sie den Endpunkt als verschiedene Textadressen auf dieser Basisadresse anhängen ...

<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> 

In Ihrem Fall könnte also die Basisadresse localhost/WebServiceName lauten und die Endpunktadresse für Endpunkt 1 könnte Service1/Service.svc lauten. Ähnlich könnte es für Endpunkt 2 Service2/Service.svc sein. Ich kann sehen, dass Sie der Empfehlung gefolgt sind, die vollständige Adresse in die Endpunktadresse zu schreiben, aber alles, was ich sagen kann, ist, dass ich es mit Erfolg getan habe.

+0

Auch mit dieser Methode bekomme ich den HTTP 404-Fehler für localhost: 8733/MyBaseAddress/FirstEndpointName/Service.svc (obwohl ich versuche, eine Service-Referenz in einem Client scheinbar localhost hinzuzufügen: 8733/MyBaseAddress/Service.svc wird während gesehen Dienste entdecken, mit beiden Schnittstellen, die in meinem Fall schlecht sind). Kann es einen Konfigurationsfehler in Bezug auf IIS geben, nicht web.config? Ich habe versucht, zwei virtuelle Verzeichnisse für die beiden Endpunkte zu generieren, aber beide virtuellen Verzeichnisse werden an die Schnittstelle des ersten Endpunkts gebunden. –

+1

Sofern Sie nicht einen Ihrer Endpunkte mit der Adresse "FirstEndpointName/Service.svc" angegeben haben, würde ich nicht erwarten, dass die Adresse, die Sie verwendet haben, funktioniert. Denken Sie daran, dass Endpunktnamen und Endpunktadressen unterschiedliche Dinge sind. – Martin

+0

Die ultimative Adresse lautet: localhost: 8733/MyBaseAddress/Service.svc/FirstEndpointAddress und localhost: 8733/MyBaseAddress/Service.svc/SecondEndpointAddress Im Client-Code: var svcClient = new ServiceReference1.ServiceClient ("SecondEndpointName"); – hB0

Verwandte Themen