2012-05-29 2 views
1

Я пытаюсь разместить службу wcf в службе windows по tcp. Все идет нормально до этапа установки сервиса и запуска его. Однако, когда я добавил клиентское приложение и при попытке добавить ссылку на службу, я получаю эту ошибку.Базовый хостинг WCF через TCP

System.ServiceModel.AddressAlreadyInUseException: 
There is already a listener on IP endpoint 0.0.0.0:8523. 
Make sure that you are not trying to use this endpoint multiple times 
in your application and that there are no other applications listening 
on this endpoint. ---> 

System.Net.Sockets.SocketException: Only one usage of each socket address 
(protocol/network address/port) is normally permitted 
    at System.Net.Sockets.Socket.DoBind(EndPoint endPointSnapshot, 
     SocketAddress socketAddress) 
    at System.Net.Sockets.Socket.Bind(EndPoint localEP) 
    at System.ServiceModel.Channels.SocketConnectionListener.Listen() 
    --- End of inner exception stack trace --- 
    at System.ServiceModel.Channels.SocketConnectionListener.Listen() 
    at System.ServiceModel.Channels.ConnectionAcceptor.StartAccepting() 
    at System.ServiceModel.Channels.ExclusiveTcpTransportManager.OnOpen() 
    at System.ServiceModel.Channels.TransportManager.Open(
     TransportChannelListener channelListener) 
    at System.ServiceModel.Channels.TransportManagerContainer.Open(
     SelectTransportManagersCallback selectTransportManagerCallback) 
    at System.ServiceModel.Channels.TcpChannelListener`2.OnOpen(
     TimeSpan timeout) 
    at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout) 
    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 Microsoft.Tools.SvcHost.ServiceHostHelper.OpenService(ServiceInfo info) 

System.Net.Sockets.SocketException (0x80004005): Only one usage of each socket 
address (protocol/network address/port) is normally permitted 
    at System.Net.Sockets.Socket.DoBind(EndPoint endPointSnapshot, 
     SocketAddress socketAddress) 
    at System.Net.Sockets.Socket.Bind(EndPoint localEP) 
    at System.ServiceModel.Channels.SocketConnectionListener.Listen() 

Это из-за межсетевого экрана или какой-либо другой проблемы? Это очень простой сервис, и конечная точка приведена ниже: net.tcp://localhost:8523/CalculatorService.

Вот конфигурационный файл:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 

    <system.web> 
    <compilation debug="true" /> 
    </system.web> 
    <!-- When deploying the service library project, the content of the config file must be added to the host's 
    app.config file. System.Configuration does not support config files for libraries. --> 
    <system.serviceModel> 
    <services> 
     <service name="Service.CalculatorService"> 
     <endpoint address="" binding="netTcpBinding" bindingConfiguration="" 
      contract="Service.ICalculatorService"> 
      <identity> 
      <dns value="localhost" /> 
      </identity> 
     </endpoint> 
     <endpoint address="mex" binding="netTcpBinding" bindingConfiguration="" 
      contract="IMetadataExchange" /> 
     <host> 
      <baseAddresses> 
      <add baseAddress="net.tcp://localhost:8523/CalculatorService" /> 
      </baseAddresses> 
     </host> 
     </service> 
    </services> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name=""> 
      <serviceMetadata httpGetEnabled="false" /> 
      <serviceDebug includeExceptionDetailInFaults="false" /> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    </system.serviceModel> 

</configuration> 

и код услуги:

public partial class Service1 : ServiceBase 
    { 
     internal static ServiceHost myServiceHost = null; 

     public Service1() 
     { 
      InitializeComponent(); 
     } 
     protected override void OnStart(string[] args) 
     { 
      if (myServiceHost != null) 
      { 
       myServiceHost.Close(); 
      } 
      myServiceHost = new ServiceHost(typeof(CalculatorService)); 
      myServiceHost.Open(); 
     } 
     protected override void OnStop() 
     { 
      if (myServiceHost != null) 
      { 
       myServiceHost.Close(); 
       myServiceHost = null; 
      } 
     } 

Я справлялся конфигурационный файл из библиотеки WCF службы для проекта окна обслуживания, и они идентичны.

+0

Что делает ваш конфиг выглядит? – FishBasketGordo

+0

Как начать сервис? Можете ли вы предоставить код для этого? – Adam

ответ

1

попробовать этот код:

protected override void OnStart(string[] args) 
{ 
    if (myServiceHost != null) 
    { 
     myServiceHost.Close(); 
    } 
    Uri baseAddress = new Uri("http://localhost:8523/CalculatorService"); 
    myServiceHost = new ServiceHost(typeof(CalculatorService), baseAddress); 
    myServiceHost.Open(); 
} 

и этот Web.config

<?xml version="1.0"?> 
<configuration> 

    <system.web> 
    <compilation debug="true" targetFramework="4.0" /> 
    </system.web> 
    <system.serviceModel> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior> 
      <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment --> 
      <serviceMetadata httpGetEnabled="true"/> 
      <!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information --> 
      <serviceDebug includeExceptionDetailInFaults="false"/> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" /> 
    </system.serviceModel> 
<system.webServer> 
    <modules runAllManagedModulesForAllRequests="true"/> 
    </system.webServer> 

</configuration> 
+0

После этого, добавив ссылку на службу, в сообщение firewall появилось сообщение о том, что он блокирует WCFSVC и спрашивает меня, хочу ли я разблокировать его, и я сказал «да» частной сети и домашней сети, но отключил опцию «Общественные сети». После этого я получаю эту ошибку при добавлении ссылки: – Mike

+0

Метаданные содержат ссылку, которая не может быть разрешена: 'net.tcp: // localhost: 8523/CalculatorService/mex'. Соединение сокета было прервано. Это может быть вызвано ошибкой обработки вашего сообщения или превышением времени приема удаленным хостом или проблемой сетевого ресурса. Локальный тайм-аут гнезда был «00: 04: 59.6059775». Существующее соединение было принудительно закрыто удаленным хостом Если служба определена в текущем решении, попробуйте создать решение и снова добавить ссылку на службу. – Mike

+0

Отредактировал свой ответ. Используйте мой Web.config и посмотрите, работает ли он. – Adam

Смежные вопросы