8 Stimmen

WCF Mehrere Bindungen

Ich erhalte die folgende Fehlermeldung, wenn ich mehrere Endpunkte ausprobiere.

System.ServiceModel.AddressAlreadyInUseException: The TransportManager failed to listen on the supplied URI using the NetTcpPortSharing service: the service failed to listen.
   at System.ServiceModel.Channels.SharedConnectionListener.SharedListenerProxy.Register()
   at System.ServiceModel.Channels.SharedConnectionListener.SharedListenerProxy.Open(Boolean isReconnecting)
   at System.ServiceModel.Channels.SharedConnectionListener.StartListen(Boolean isReconnecting)
   at System.ServiceModel.Channels.SharedConnectionListener..ctor(BaseUriWithWildcard baseAddress, Int32 queueId, Guid token, OnDuplicatedViaDelegate onDuplicatedViaCallback)
   at System.ServiceModel.Channels.SharedTcpTransportManager.OnOpenInternal(Int32 queueId, Guid token)
   at System.ServiceModel.Channels.SharedTcpTransportManager.OnOpen()
   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.ConnectionOrientedTransportChannelListener.OnOpen(TimeSpan timeout)
   at System.ServiceModel.Channels.TcpChannelListener`2.OnOpen(TimeSpan timeout)
   at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)
   at System.ServiceModel.Channels.ReliableChannelListenerBase`1.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 System.ServiceModel.Channels.CommunicationObject.Open()
   at Microsoft.Tools.SvcHost.ServiceHostHelper.OpenService(ServiceInfo info)

Hier ist der Inhalt meiner App.Config

<?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>
    <bindings>
      <netTcpBinding>
        <binding name="tcpBinding" transferMode="Buffered" portSharingEnabled="true">
          <reliableSession enabled="true" />
          <security mode="None">
            <transport clientCredentialType="None" protectionLevel="None" />
            <message clientCredentialType="None" />
          </security>
        </binding>
      </netTcpBinding>
    </bindings>
    <services>
      <service behaviorConfiguration="WcfServiceLibrary1.Service1Behavior"
        name="WcfServiceLibrary1.Service1">
        <endpoint address="" binding="wsHttpBinding" contract="WcfServiceLibrary1.IService1">
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
        <endpoint address="Service" binding="netTcpBinding" bindingConfiguration="tcpBinding"
          name="testTcp" contract="WcfServiceLibrary1.IService1" />
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8731/Design_Time_Addresses/WcfServiceLibrary1/Service1/" />
            <add baseAddress="net.tcp://localhost:8731/Design_Time_Addresses/WcfServiceLibrary1/Service" />

          </baseAddresses>

        </host>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="WcfServiceLibrary1.Service1Behavior">
          <!-- 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>
  </system.serviceModel>
</configuration>

Es wäre toll, wenn mir jemand sagen könnte, wo ich falsch liege.

Der TCP-Portfreigabedienst von Net ist sowohl in App.Config als auch im Windows-Dienst aktiviert, mehr konnte ich nicht überprüfen.

13voto

jrista Punkte 31522

Sie können nicht den gleichen exakten Port zwischen zwei verschiedenen Bindungen teilen, die basierend auf der Konfiguration, die Sie oben gepostet haben, sind Sie derzeit tun. Sie müssen Ihre wsHttp-Bindung an einem anderen Port als die net.tcp-Bindung haben. Der Zweck der gemeinsamen Nutzung des net.tcp-Ports besteht darin, mehreren Prozessen die Nutzung desselben Ports für mehrere net.tcp Bindungen ... nicht einen einzigen Port für mehrere verschiedene Bindungen und Protokolle zu nutzen.

Um die WCF-Net.Tcp-Portfreigabe erfolgreich zu nutzen, müssen Sie den "Net.Tcp Port Sharing Service" starten (beachten Sie, dass Net.Tcp ausdrücklich im Namen genannt wird). Wahrscheinlich möchten Sie ihn auch auf automatischen Start einstellen, damit Sie ihn bei einem Neustart nicht immer wieder starten müssen. Sobald der Windows-Dienst für die Portfreigabe gestartet ist, können Sie einen einzelnen Port für eine beliebige net.tcp-Bindung freigeben, und zwar im selben Prozess, über mehrere Prozesse hinweg und auf demselben physischen Rechner. Für jede net.tcp-Bindung, die einen Anschluss freigeben muss, muss die Eigenschaft portSharingEnabled auf true gesetzt werden. Wenn Sie dies tun, sollten Sie in der Lage sein, denselben Port für jeden net.tcp-Endpunkt, bei dem die Portfreigabe aktiviert ist, in jedem Prozess wiederzuverwenden.

Dadurch können Sie denselben Anschluss nicht mit einer der wsHttp-Bindungen, der basicHttp-Bindung, einer MSMQ-Bindung oder einer Drittanbieterbindung gemeinsam nutzen. Diese Funktion ist spezifisch für die netTcpBindung, die mit WCF geliefert wird.

Als Referenz: http://msdn.microsoft.com/en-us/library/ms734772.aspx

1voto

Andy White Punkte 83877

Es könnte sein, dass Sie denselben Port für die HTTP- und TCP-Verbindungen verwenden. Versuchen Sie, den Port für die TCP-Verbindung auf 8732 oder einen anderen Port als 8731 zu ändern.

1voto

sebagomez Punkte 9211

Ich würde vorschlagen, Sie aktivieren Rückverfolgung um ein besseres Verständnis des Problems zu erhalten. WCF kann eine Zicke sein, wenn es um die Anzeige von Fehlermeldungen geht.

0voto

Shiraz Bhaiji Punkte 62129

Möglicherweise handelt es sich eher um ein Problem mit der tcp-Bindung/Konfiguration als um ein Problem mit mehreren Bindungen.

Um es zu testen, entfernen Sie den Verweis auf die http-Bindung und prüfen Sie, ob die tcp-Bindung allein funktioniert.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X