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/RemoteUserManager và http://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>
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
@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ụ? –
Để 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? –