2010-01-06 12 views
10

Tengo dos direcciones base definida en el archivo de configuración de servicio WCF:WCF Base de Servicio dirección HTTP y netTcp

<?xml version="1.0" encoding="utf-8" ?> 
<configuration>  
    <system.diagnostics> 
    <sources> 
     <source name="System.ServiceModel" switchValue="Warning, ActivityTracing" 
     propagateActivity="true"> 
     <listeners> 
      <add type="System.Diagnostics.DefaultTraceListener" name="Default"> 
      <filter type="" /> 
      </add> 
      <add name="ServiceModelTraceListener"> 
      <filter type="" /> 
      </add> 
     </listeners> 
     </source> 
    </sources> 
    <sharedListeners> 
     <add initializeData="C:\WCF Service Logs\app_tracelog.svclog" 
     type="System.Diagnostics.XmlWriterTraceListener, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" 
     name="ServiceModelTraceListener" traceOutputOptions="DateTime, Timestamp"> 
     <filter type="" /> 
     </add> 
    </sharedListeners> 
    </system.diagnostics> 
    <system.serviceModel> 
    <bindings> 
     <netTcpBinding> 
     <binding name="netTcp" maxBufferPoolSize="50000000" maxReceivedMessageSize="50000000"> 
      <readerQuotas maxDepth="500" maxStringContentLength="50000000" maxArrayLength="50000000" maxBytesPerRead="50000000" maxNameTableCharCount="50000000" /> 
      <security mode="None"></security> 
     </binding> 
     </netTcpBinding> 
    </bindings> 
    <services> 
     <service behaviorConfiguration="ReportingComponentLibrary.TemplateServiceBehavior" 
     name="ReportingComponentLibrary.TemplateReportService"> 
     <endpoint address="TemplateService" binding="netTcpBinding" bindingConfiguration="netTcp" 
      contract="ReportingComponentLibrary.ITemplateService"></endpoint> 
     <endpoint address="ReportService" binding="netTcpBinding" bindingConfiguration="netTcp" 
      contract="ReportingComponentLibrary.IReportService"/> 
     <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
     <host> 
      <baseAddresses> 
      <add baseAddress="net.tcp://localhost:8001/TemplateReportService" /> 
      <add baseAddress="http://localhost:8181/TemplateReportService" /> 
      </baseAddresses> 
     </host> 
     </service> 
    </services> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="ReportingComponentLibrary.TemplateServiceBehavior"> 
      <serviceMetadata httpGetEnabled="True"/> 
      <serviceDebug includeExceptionDetailInFaults="True" /> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    </system.serviceModel> 
</configuration> 

y aunque he puesto de unión como se netTcpBinding punto final,
sólo soy capaz de acceder a mi WCF servicio con dirección base:

http://localhost:8181/TemplateReportService 

y no con

net.tcp://localhost:8001/TemplateReportService 

¿Cómo puedo hacer que mi servicio acceda con la dirección netTcp?

Respuesta

15

que ha definido una dirección base Net.TCP ser:

net.tcp://localhost:8001/TemplateReportService 

Sus criterios de valoración con red TCP son:

<endpoint address="TemplateService" 

y

<endpoint address="ReportService" 

Por lo que su dirección de servicio completo se ser "dirección base netTcp" + "dirección relativa como se define en el elemento <endpoint>" - esto da:

net.tcp://localhost:8001/TemplateReportService/TemplateService 

y

net.tcp://localhost:8001/TemplateReportService/ReportService 

con respeto.

¿Se puede usar en estas direcciones?

Además, definió un punto final "mex" (intercambio de metadatos) para el protocolo HTTP, es por eso que puede ver algo cuando navega a la dirección HTTP. Pero no especificó un punto final MEX para netTcp.

+0

Gracias Marc, así que significa que incluso si he puesto netTcpBinding tanto para los puntos finales, pero si tengo estos metadatos expuestos por HttpBinding, se expondrá el servicio en dirección HTTP. – iniki

+0

Expondrá los metadatos del servicio en la dirección http, lo que significa que solo puede navegar allí con su navegador. Los puntos finales NetTcp están activos y listos para ser utilizados; no puede obtener nada en un navegador yendo allí ... –

1

Debido a que no tengo las respuestas lo suficientemente claras, decidí buscar por mi cuenta la mejor solución. Esto es lo que debe hacer para configurar un punto final del servicio WCF NET TCP en IIS 7.0.

Para lograr esto, necesitamos dos pasos:

  1. configurar un archivo de configuración para el punto final WCF red TCP
  2. Configurar IIS para TCP neta

1. Configurar un archivo de configuración para WCF net tcp endpoint

A continuación se muestra un archivo de configuración típico, observe que el valor para "agregar ress ", en el punto final del servicio, está vacío.

También tenga en cuenta que dentro del nodo "host" estoy agregando 2 direcciones base, un http y un net tcp protocolos respectly. Como el servicio está alojado en IIS, no tiene que preocuparse por la dirección absoluta en el punto final, IIS lo averigua en función de la dirección base que hemos definido dentro del nodo "host".

<system.serviceModel> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="behaviorConfig"> 
      <!--your custom behavior here--> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <bindings> 
     <basicHttpBinding> 
     <binding name="basicHttpBindingConfig"/> 
     </basicHttpBinding> 
     <netTcpBinding> 
     <!--our netTcpBinding binding--> 
     <binding name="netTcpBindingConfig"/> 
     </netTcpBinding> 
    </bindings> 
    <services> 
     <service name="MyNamespace.ServiceLayer.MyService" behaviorConfiguration="behaviorConfig"> 
     <!--Endpoint for basicHttpBinding--> 
     <endpoint address="" binding="basicHttpBinding" contract="MyNamespace.ServiceLayer.IMyService" bindingConfiguration="basicHttpBindingConfig"/> 
     <!--Endpoint for netTcpBindingConfig--> 
     <endpoint address="" binding="netTcpBinding" contract="MyNamespace.ServiceLayer.IMyService" bindingConfiguration="netTcpBindingConfig"> 
     <identity> 
      <dns value="localhost" /> 
     </identity> 
    </endpoint> 
    <!--Make sure you add a mexTcpBinding, without it you will receive an error when trying to resolve service's reference--> 
    <endpoint address="mex" 
       binding="mexTcpBinding" 
       bindingConfiguration="" 
       name="MyServiceMexTcpBidingEndpoint" 
       contract="IMetadataExchange" /> 
     <host> 
      <!--This part is important for IIS to determine the base addresses for your endpoints--> 
      <baseAddresses>    
       <!--Notice that baseAddress for net tcp is preceded by net.tcp --> 
       <!--then ://localhost:{port} --> 
       <!--Also the same for http, so you can figure out how to define a baseAddress for https--> 
       <add baseAddress="net.tcp://localhost:8090"/> 
       <add baseAddress="http://localhost:8080"/> 
      </baseAddresses> 
     </host> 
     </service> 
    </services>  
    </system.serviceModel> 

2. Configurar IIS para TCP neta

En IIS, (después actualiza su servicio con la nueva configuración) activar el protocolo net.tcp. Estos son los pasos:

  • Abra IIS.
  • En la lista de sitios, encontrar su "sitio" donde se aloja su WCF, a continuación, haga clic en él
  • a continuación, seleccione "Modificar enlaces",
  • una lista de las asociaciones aparece (asegúrese de que net.tcp hay allí), a continuación, añadir la configuración net.tcp,
  • clic en "Añadir",
  • tipo net.tcp (o seleccione net.tcp de una lista desplegable si está disponible)
  • en el tipo de información de enlace : 8090: * (asegúrese de que sea el mismo puerto que en el host> dirección base que había agregado)
  • luego cierre esta ventana y reinicia tu servicio.

Después de hacer esto, también hay otra configuración:

  • Abrir IIS
  • En los sitios de la lista, encontrar su "sitio" donde se aloja su WCF, a continuación, haga clic en él
  • Haga clic en "Configuración avanzada"
  • Seleccione Protocolos habilitados
  • Establecer el valor de HTTP, net.tcp (asegúrese de que no hay espacios en blanco entre http, net.tcp)
  • a reiniciar el servicio

Además, si usted todavía no puede acceder al servicio, es posible que tenga que empezar su adaptador oyente net.tcp en su servidor. Para lograr esto, por favor, siga los siguientes pasos:

  • Ir a ServerManager -> Configuración -> Servicios, detenga el adaptador del Receptor de net.tcp y el Servicio net.tcp compartido de puertos. Entonces comenzadlos de nuevo.

Esto es todo lo que tiene que hacer para tener un punto final netccp WCF habilitado en IIS.

Espero que esto ayude.

Saludos

+0

No entendí sus ediciones sobre mi respuesta en http://stackoverflow.com/questions/18575496/could-not-find-a-base-address-that-matches-scheme-net-tcp-for-the-endpoint-with/18575819 # 18575819 Compruebe sus estados antes de promocionarlos. IIS6 NO SOPORTA NET.TCP !!! Ver http://msdn.microsoft.com/en-us/library/ms730158.aspx – Alex

Cuestiones relacionadas