Pregunta

Tengo dos sitios web en la misma máquina. El primero (cliente) hace referencia a un servicio WCF en el segundo sitio (servidor).

¿Cómo configuro la dirección para la referencia de servicio? Al pasar del desarrollo en mi máquina local al servidor de desarrollo de grupo, ¿cómo cambio la URL del servicio? Los sitios están diferenciados por encabezados de host, como http: //dev.admin/ ... y http: //dev.public/ ...

Siento que esto se puede manejar usando múltiples puntos finales, pero soy muy nuevo en WCF y realmente no tengo ni idea de lo que estoy haciendo aquí.

¿Fue útil?

Solución

Después de mucha frustración, logré determinar que tanto los archivos web.config (en el cliente como en el servidor, ambos de los cuales son aplicaciones web en este caso), se deben cambiar las siguientes secciones:

Client:

   <client>
      <endpoint 
        address="http://mysite.com:port/services/someservice.svc"
        binding="basicHttpBinding" 
        bindingConfiguration="BasicHttpBinding_ISomeService"
        contract="MyServices.ISomeService" 
        name="BasicHttpBinding_ISomeService" />

    </client>
  </system.serviceModel>

Servidor

 <system.serviceModel>
    <serviceHostingEnvironment>
      <baseAddressPrefixFilters>
        <add prefix="http://mysite.com:port/services"/>
      </baseAddressPrefixFilters>
    </serviceHostingEnvironment>
    <behaviors>
      <serviceBehaviors>
        <behavior name="MyServices.SomeServiceBehavior">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="false" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <services>
      <service behaviorConfiguration="MyServices.SomeServiceBehavior"
        name="MyServices.SomeService">
          <endpoint address="http://mysite.com:port/services/someservice.svc" 
                    name="endpoint.SomeService"
                    binding="basicHttpBinding" 
                    bindingConfiguration="" 
                    contract="MyServices.ISomeService"/>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
      </service>
    </services>
  </system.serviceModel>

Lo que hay que tener en cuenta aquí es que la dirección del host en las tres secciones relevantes (dirección del punto final del cliente, valor de la base de dirección del servidor, y la dirección del punto final del servidor) deben coincidir.

Puedo cambiar entre servidores modificándolos, siempre que coincidan. Todavía preferiría una forma de configurar esto en función de la máquina en la que se ejecuta el servidor, pero esto funciona por el momento.

Impresiones de WCF Lo que está de moda: objeto persistente. El objeto proxy del cliente (creado cuando agrega una referencia de servicio) mantiene una conexión persistente al servicio en el servidor. La instancia de servicio a la que hace referencia el cliente proxy mantiene su estado entre las llamadas, lo que puede simplificar las firmas de métodos y hace que el objeto de cliente proxy, y el servicio en su conjunto, sea mucho más útil para ciertas aplicaciones. Los tipos de objetos de parámetros se pueden compartir entre el cliente y el servidor si se declaran en una biblioteca común, lo que significa que no tiene que crear dos clases muy similares o clases de derivador para pasar las estructuras de datos no primitivas de un lado a otro.

Lo que no es: la configuración es un dolor real, mal documentado y demasiado complicado. Hacer que esto funcione en una configuración de entorno de prueba / desarrollo / desarrollo / producción donde el servicio debe ser consciente de su ubicación es frustrante. No estoy convencido de que hacer que el servicio tenga conocimiento de su URL de dominio (en lugar de, digamos, una ruta relativa a lo que sea que esté ejecutando) tiene algún beneficio significativo, aparte de los problemas de seguridad.

Dicho esto, continuaré por el camino de WCF ya que las ventajas hasta ahora superan con creces los dolores de cabeza.

Otros consejos

La forma más sencilla: ejecute las partes WCF en diferentes puertos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top