2010-03-09 51 views
5

Tôi đang chạy dịch vụ WCF từ bên trong exe (để gỡ lỗi, dịch vụ này sẽ được chuyển sang dịch vụ cửa sổ khi được triển khai). khi tôi chạy dịch vụ thứ hai, tôi nhận được ngoại lệDịch vụ WCF không thể khởi động khi có nhiều hơn một dịch vụ

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: 

đây là mã gọi nó.

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(); 
} 

Và đây là tệp App.config của tôi Tôi đã sử dụng Trình chỉnh sửa cấu hình dịch vụ trong studio trực quan 2010 để tạo.

REMOVED 

Tôi cần thay đổi gì trong tệp App.config để cho phép nhiều dịch vụ không phải chạy trên các cổng khác nhau. Tôi muốn truy vấn http://backupsvr:8082/ và yêu cầu tất cả các dịch vụ có sẵn khi tôi sử dụng công cụ "Thêm dịch vụ làm mát".

CẬP NHẬT -

tôi đã gợi ý Igor của nó bây giờ chạy trên cùng một cổng tuy nhiên trong hộp thoại Add refrence dịch vụ tôi vẫn cần phải gõ vào http://backupsvr:8082/RemoteUserManagerhttp://backupsvr:8082/DatabaseManagement insted chỉ một http://backupsvr:8082/. Tôi không biết nếu những gì tôi muốn là sở hữu, có vẻ như đó là cách nó nên được bằng cách các hộp thoại được thiết kế. đây là một bản sao cập nhật của app.config tôi nộp

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

sử dụng một khác nhau baseaddress cho mọi dịch vụ và thứ hai không thể có nhiều dịch vụ trên một cổng (nhiều điểm cuối nhưng một cổng để thực hiện dịch vụ) – garik

+0

@Igor, Nếu bạn chỉ có thể có một dịch vụ tại sao bạn nhấp vào từ danh sách "dịch vụ có sẵn" khi bạn sử dụng thêm tham chiếu dịch vụ? –

+0

Để khắc phục lỗi, nó có hoạt động khi bạn chuyển đổi thứ tự của 2 cuộc gọi Open() hoặc khi bạn chỉ chạy lệnh thứ hai? –

Trả lời

7

sử dụng cho dịch vụ đầu tiên

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

sử dụng cho dịch vụ thứ hai

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

địa chỉ phải là duy nhất

+1

Bạn nói đúng, mặc dù tôi hiểu câu hỏi của Scotts. Có vẻ không cần thiết với phần 'địa chỉ' trong cấu hình dịch vụ. Tôi cũng đã nhìn thấy các giải pháp với 2 số cổng khác nhau (8082, 8083) –

+0

Nó bây giờ chạy với cả hai trên cùng một cổng. Tuy nhiên tôi phải gọi http: // backupsvr: 8082/DatabaseManagement và http: // backupsvr: 8082/RemoteUserManager để lấy các giao diện của chúng. Tôi muốn nó nếu tôi chỉ có thể gọi gốc và có cả hai xuất hiện. Tôi sẽ cập nhật bài đăng gốc với các thay đổi của mình. –

+0

Tôi chưa bao giờ thử như vậy, tôi muốn bạn triển khai cả hai giao diện bởi một lớp MySuperManagement. Bằng cách sử dụng theo cách này nó có thể được thực hiện, tôi đoán. :). Bất kỳ cách nào khách hàng của dịch vụ web của bạn cũng nên hiểu dịch vụ nào sử dụng trên cổng/địa chỉ đó (sử dụng các cổng khác nhau hoặc các địa chỉ khác nhau). – garik

Các vấn đề liên quan