2010-03-09 7 views
5

Ich führe einen WCF-Dienst innerhalb einer EXE aus (zum Debuggen wird er bei der Bereitstellung in den Windows-Dienst verschoben) Wenn ich einen zweiten Dienst ausführen, bekomme ich die AusnahmeWCF-Dienst kann nicht gestartet werden, wenn mehr als ein Dienst verfügbar ist

System.InvalidOperationException was unhandled 
    Message=The ChannelDispatcher at 'http://backupsvr:8082/' with contract(s) '"IHttpGetHelpPageAndMetadataContract"' is unable to open its IChannelListener. 
    Source=System.ServiceModel 
    StackTrace: 
     at System.ServiceModel.Dispatcher.ChannelDispatcher.OnOpen(TimeSpan timeout) 
     at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout) 
     at System.ServiceModel.ServiceHostBase.OnOpen(TimeSpan timeout) 
     at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout) 
     at System.ServiceModel.Channels.CommunicationObject.Open() 
     at Service.Program.Main() in E:\Visual Studio 2010\Projects\Contract Flow Suite\Service\Program.cs:line 30 
    InnerException: System.InvalidOperationException 
     Message=A registration already exists for URI 'http://backupsvr:8082/'. 
     Source=System.ServiceModel 
     StackTrace: 
      at System.ServiceModel.Channels.UriPrefixTable`1.RegisterUri(Uri uri, HostNameComparisonMode hostNameComparisonMode, TItem item) 
      at System.ServiceModel.Channels.HttpTransportManager.Register(TransportChannelListener channelListener) 
      at System.ServiceModel.Channels.TransportManager.Open(TransportChannelListener channelListener) 
      at System.ServiceModel.Channels.TransportManagerContainer.Open(SelectTransportManagersCallback selectTransportManagerCallback) 
      at System.ServiceModel.Channels.TransportChannelListener.OnOpen(TimeSpan timeout) 
      at System.ServiceModel.Channels.HttpChannelListener.OnOpen(TimeSpan timeout) 
      at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout) 
      at System.ServiceModel.Dispatcher.ChannelDispatcher.OnOpen(TimeSpan timeout) 
     InnerException: 

Hier ist der Code, der es aufruft.

using(ServiceHost hostRemoteUserManager = new ServiceHost(typeof(RemoteUserManager))) 
using(ServiceHost hostDatabaseManagement = new ServiceHost(typeof(DatabaseManagement))) 
try 
{ 
    // Open the ServiceHost to start listening for messages. 
    hostRemoteUserManager.Open(); 
    hostDatabaseManagement.Open(); //Exception on this line. 
    // The service can now be accessed. 
    Console.WriteLine("The service is ready."); 
    Console.WriteLine("Press <ENTER> to terminate service."); 
    Console.ReadLine(); 

    // Close the ServiceHost. 
    hostRemoteUserManager.Close(); 
    hostDatabaseManagement.Close(); 
} 

Und hier ist meine Datei App.config ich den Service Configuration Editor in Visual Studio 2010, es zu erstellen.

Was muss ich in meiner App.config-Datei ändern, um mehr als einen Dienst zuzulassen, außer sie auf verschiedenen Ports auszuführen. Ich möchte http://backupsvr:8082/ abfragen und alle verfügbaren Dienste auflisten lassen, wenn ich das Tool "Service Refrence hinzufügen" verwende.

UPDATE -

Ich habe Igor Vorschlag läuft es nun auf dem gleichen Port jedoch im Dienst hinzufügen refrence Dialog muss ich noch in http://backupsvr:8082/RemoteUserManager geben und http://backupsvr:8082/DatabaseManagement insted von nur einem http://backupsvr:8082/. Ich weiß nicht, ob das, was ich möchte, möglich ist, es scheint so zu sein, wie es der Dialog sein sollte. hier ist ein Update Kopie meiner app.config

<?xml version="1.0"?> 
<configuration> 
<system.diagnostics> 
<sources> 
    <source propagateActivity="true" name="System.ServiceModel" switchValue="Off,ActivityTracing"> 
    <listeners> 
     <add type="System.Diagnostics.DefaultTraceListener" name="Default"> 
     <filter type="" /> 
     </add> 
    </listeners> 
    </source> 
    <source name="System.ServiceModel.MessageLogging" switchValue="Warning, ActivityTracing"> 
    <listeners> 
     <add type="System.Diagnostics.DefaultTraceListener" name="Default"> 
     <filter type="" /> 
     </add> 
    </listeners> 
    </source> 
</sources> 
</system.diagnostics> 
<system.serviceModel> 
<bindings> 
    <mexHttpBinding> 
    <binding name="MexBinding" /> 
    </mexHttpBinding> 
</bindings> 
<diagnostics> 
    <messageLogging logMalformedMessages="false" logMessagesAtServiceLevel="false" 
    logMessagesAtTransportLevel="false" /> 
</diagnostics> 
<behaviors> 
    <serviceBehaviors> 
    <behavior name="RemoteUserManagerBehavior"> 
     <serviceMetadata httpGetEnabled="true" /> 
    </behavior> 
    <behavior name="DatabaseManagementBehavior"> 
     <serviceMetadata httpGetEnabled="true" /> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 
<services> 
    <service behaviorConfiguration="RemoteUserManagerBehavior" name="Service.RemoteUserManager"> 
    <endpoint address="" binding="netTcpBinding" 
     bindingConfiguration="" name="RemoteUserManagerBinding" contract="Service.IRemoteUserManager" /> 
    <endpoint address="mex" binding="mexHttpBinding" 
     bindingConfiguration="MexBinding" name="RemoteUserManagerMetadata" 
     contract="IMetadataExchange" /> 
    <host> 
     <baseAddresses> 
     <add baseAddress="http://backupsvr:8082/RemoteUserManager" /> 
     <add baseAddress="net.tcp://backupsvr:8081/RemoteUserManager" /> 
     </baseAddresses> 
    </host> 
    </service> 
    <service behaviorConfiguration="DatabaseManagementBehavior" name="Service.DatabaseManagement"> 
    <endpoint address="" binding="netTcpBinding" 
     bindingConfiguration="" name="DatabaseManagementBinding" contract="Service.IDatabaseManagement" /> 
    <endpoint address="mex" binding="mexHttpBinding" 
     bindingConfiguration="MexBinding" name="DatabaseManagementMetaData" 
     contract="IMetadataExchange" /> 
    <host> 
     <baseAddresses> 
     <add baseAddress="http://backupsvr:8082/DatabaseManagement" /> 
     <add baseAddress="net.tcp://backupsvr:8081/DatabaseManagement" /> 
     </baseAddresses> 
    </host> 
    </service> 
</services> 
</system.serviceModel> 
<startup><supportedRuntime version="v2.0.50727"/></startup></configuration> 
+0

Verwendung einer anderen Datei Basisadresse für jeden Dienst und zweitens es ist unmöglich, mehr als einen Dienst an einem Port zu haben (viele Endpunkte, aber ein Port für eine Dienstimplementierung) – garik

+0

@Igor, Wenn Sie nur einen Dienst haben, warum klicken Sie aus einer Liste der "verfügbaren Dienste" wenn Sie Verwenden Sie Service-Referenz hinzufügen? –

+0

Um den Fehler zu beheben, funktioniert es, wenn Sie die Reihenfolge der 2 Open() - Aufrufe ändern, oder wenn Sie nur die zweite ausführen? –

Antwort

7

Verwendung für die erste Wartung

<baseAddresses> 
     <add baseAddress="net.tcp://backupsvr:8082/IRemoteUserManager"/> 
    </baseAddresses> 

Verwendung für die zweite Service

<baseAddresses> 
     <add baseAddress="net.tcp://backupsvr:8082/IDatabaseManagement"/> 
    </baseAddresses> 

Adressen sollte eindeutig sein

+1

Sie haben Recht, obwohl ich Scotts Frage verstehe. Scheint unnötig mit dem 'Adresse' Teil in der Service-Konfiguration. Ich habe auch Lösungen mit 2 verschiedenen Portnummern gesehen (8082, 8083) –

+0

Es läuft jetzt mit beiden auf dem gleichen Port. Allerdings muss ich http: // backupsvr: 8082/DatabaseManagement und http: // backupsvr: 8082/RemoteUserManager aufrufen, um ihre Schnittstellen zu erhalten. Ich würde es mögen, wenn ich einfach die Wurzel nennen und sie beide auftauchen lassen könnte. Ich werde den ursprünglichen Beitrag mit meinen Änderungen aktualisieren. –

+0

Ich habe es noch nie versucht, ich möchte, dass Sie beide Schnittstellen von einer Klasse MySuperManagement implementieren. Auf diese Weise könnte es möglich sein, denke ich. :). Beliebige Weise, wie die Clients Ihrer Webdienste verstehen sollten, welche Dienste an diesem Port/dieser Adresse verwendet werden (verwenden Sie unterschiedliche Ports oder unterschiedliche Adressen). – garik

Verwandte Themen