2015-01-08 2 views
3

У меня общая проблема с WCF и привязкой net.tcp. Я видел все сообщения на stackoverflow также googling тоже.Не удается найти конечную точку net.tcp в добавлении ссылки на службу в WCF?

Основная проблема, что я не могу добавить ссылку на сервис для моего клиента. я получаю сообщение об ошибке:

Could not find a base address that matches scheme net.tcp for the endpoint with binding NetTcpBinding. Registered base address schemes are [http]. 
  1. Я использую IIS 7. Я проверил, не HTTP.I добавил на веб-сайт в Enable Protocols Net.Tcp, также добавлены net.tcp к привязок. Если я нажму на адрес (http) мой адрес. Я вижу свою папку с приложением WCF, и если я выбираю файл SVC я вижу нормальный адрес:

    svcutil.exe Net.Tcp: //MYADDRESS/Service.svc/mex

Я предполагаю, что я правильно настройте свой IIS, если я увижу этот URL!

Но проблема начинается, когда я пытаюсь добавить ссылку на клиента. Только то, что я вижу http endpoints и нет net.tcp.

Вот мой конфиг на службу:

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

     <appSettings> 
     <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" /> 
     </appSettings> 
     <system.web> 
     <compilation debug="true" targetFramework="4.5" /> 
     <httpRuntime targetFramework="4.5"/> 
     </system.web> 
     <system.serviceModel> 
     <services> 
      <service name="MYSERVICE.SERVICE" behaviorConfiguration="behavior1"> 
      <endpoint 
         binding="netTcpBinding" 
         contract="MYSERVICE.ISERVICE"> 
       <identity> 
       <dns value="localhost" /> 
       </identity> 
      </endpoint> 
      <endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange" /> 
      <host> 
       <baseAddresses> 
       <add baseAddress="net.tcp://localhost:60745/MYSERVICE/SERVICE/"/> 
       </baseAddresses> 
      </host> 
      </service> 
     </services> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="behavior1"> 
      <serviceMetadata httpGetEnabled="false" httpsGetEnabled="false"/> 
      <serviceDebug includeExceptionDetailInFaults="false"/> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <protocolMapping> 
     <add binding="netTcpBinding" scheme="net.tcp" /> 
    </protocolMapping>  
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" /> 
    </system.serviceModel> 
    <system.webServer> 
    <modules runAllManagedModulesForAllRequests="true"/> 
    <directoryBrowse enabled="true"/> 
    </system.webServer> 

</configuration> 

Примечание: мой веб-сайт начинается от 60745 адреса, но для net.tcp связывания в IIS Я добавил 60746: * Также я открыл правила Inbound Outbound для обоих портов ,

Спасибо!

+1

У вас есть функция «Активация подключения к Windows Communication Foundation без HTTP» включена в ваших функциях Windows на вашем сервере IIS? –

+0

есть. Я включил его. – user1711993

+1

Если ваша программа .NET 4.5, вы активизировали активацию TCP в .NET Framework 4.5 Advanced Services (если у вашей ОС, на которой работает IIS, есть) –

ответ

3

Из-за проблемы, о которой вы упоминали в своих комментариях, я тоже запустил ее, так что gui для Add Service Reference не справляется с mexTcpBinding очень хорошо.

Вы можете использовать HTTP mex для метаданных и по-прежнему использовать net.tcp для своего канала данных. Вот пример из одного из моих проектов, который использует tcp-каналы с http mex.

<system.serviceModel> 
    <bindings> 
     <netTcpBinding> 
     <binding name="NetTcpConfig" closeTimeout="00:30:00" openTimeout="00:30:00" receiveTimeout="00:30:00" sendTimeout="00:30:00" transferMode="Streamed" 
      maxReceivedMessageSize="67108864"> 
      <security mode="Transport"> 
      <transport clientCredentialType="None"/> 
      </security> 
     </binding> 
     </netTcpBinding> 
    </bindings> 
    <behaviors> 
     <endpointBehaviors> 
     <behavior name="AsyncStreaming"> 
      <dispatcherSynchronization asynchronousSendEnabled="true"/> 
     </behavior> 
     </endpointBehaviors> 
     <serviceBehaviors> 
     <behavior name=""> 
      <serviceMetadata httpGetEnabled="true" httpsGetEnabled="false"/> 
      <serviceDebug includeExceptionDetailInFaults="true"/> 
      <serviceCredentials> 
      <serviceCertificate findValue="Example" x509FindType="FindBySubjectName"/> 
      </serviceCredentials> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <services> 
     <service name="Server.Endpoints.ExampleEndpoint"> 
     <endpoint address="" behaviorConfiguration="AsyncStreaming" binding="netTcpBinding" bindingConfiguration="NetTcpConfig" contract="Server.IExample"/> 
     <endpoint address="" behaviorConfiguration="AsyncStreaming" binding="netTcpBinding" bindingConfiguration="NetTcpConfig" contract="Server.IExample2"/> 
     <endpoint address="" behaviorConfiguration="AsyncStreaming" binding="netTcpBinding" bindingConfiguration="NetTcpConfig" contract="Server.IExample3"/> 
     <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> 
     </service> 
    </services> 
    <protocolMapping> 
     <add binding="netTcpBinding" scheme="net.tcp" bindingConfiguration="NetTcpConfig"/> 
    </protocolMapping>  
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true"/> 
    <diagnostics wmiProviderEnabled="false"> 
     <messageLogging logEntireMessage="true" logMalformedMessages="true" logMessagesAtServiceLevel="true" logMessagesAtTransportLevel="true" 
     maxMessagesToLog="3000"/> 
    </diagnostics> 
    </system.serviceModel>