2009-01-07 24 views
10

El sitio web de mi empleador tiene varios nombres de host que afectan al mismo servidor y solo mostramos más diseños para fines de desarrollo de marca.WCF y varios encabezados de host

Desafortunadamente WCF no parece funcionar bien en esta situación.

He intentado overriding the default host with a custom host factory.

Eso no es una solución aceptable, ya que tiene que trabajar desde todas las máquinas, no sólo 1.

También he mirado this blog post pero o bien no pude conseguir que funcione o que no estaba destinado a resolver mi problema

El error que estoy recibiendo es "Esta colección ya contiene una dirección con el esquema http"

Tiene que haber una manera de configurar esto, por favor ayuda :)

+0

¿Está alojando su WCF con IIS o está creando un proveedor de alojamiento personalizado? – thaBadDawg

+0

Además, ¿cuál es el problema/problema específico que tiene? Es decir. ¿el servicio no funciona, devuelve respuestas incorrectas (URL) o es que el servicio desconoce qué cliente realiza la llamada? –

+0

estoy alojando con IIS – Ryu

Respuesta

5

Si usted no pone una dirección en el punto final, entonces debería resolverse a cualquier servidor que llegue al servicio. Utilizo este código y se resuelve tanto en mi dirección .local como en mi dirección .com de IIS.

<system.serviceModel> 
    <services> 
     <service name="ServiceName" behaviorConfiguration="ServiceName.Service1Behavior"> 
      <endpoint address="" binding="wsHttpBinding" contract="iServiceName"> 
      </endpoint> 
      <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> 
     </service> 
    </services> 
    <behaviors> 
     <serviceBehaviors> 
      <behavior name="ServiceName.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="true"/> 
      </behavior> 
     </serviceBehaviors> 
    </behaviors> 
</system.serviceModel> 
+0

¿funciona este escenario cuando tiene múltiples encabezados de host? parece que no funciona para mí (ASP.NET 3.5/IIS 6). La publicación de zcrar70 parece estar de acuerdo. – russau

-1

Estoy seguro de que ya lo has entendido, pero por pura diversión publicaré aquí de todos modos.

Tuve este problema exacto y pasé una eternidad tratando de resolverlo. La mejor solución es poner direcciones base de host en su definición de servicio, que permite que el servicio opere bajo estas múltiples direcciones. Para que esta solución funcione, aún necesita que se anule el ServiceHostFactory. Como ya has hecho eso, déjalo allí.

<service behaviorConfiguration="ServiceBehaviour" name="Api.Service"> 
    <endpoint address="soap" binding="basicHttpBinding" contract="Api.IService" /> 
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
    <host> 
     <baseAddresses> 
     <add baseAddress="http://host1.com/Api" /> 
     <add baseAddress="http://host2.com/Api" /> 
     </baseAddresses> 
    </host> 
    </service> 
+2

baseAddresses se ignora en IIS. ("Esto se ignora por completo cuando se aloja en IIS" http://msdn.microsoft.com/en-us/library/ms788995.aspx) – russau

+0

desafortunadamente esto no funcionó para mí tampoco ... sigue buscando una solución. – Tone

5

No creo que el direcciones base anfitrionas solución publicado anterior funcionará para los sitios web alojado en IIS (el PO no mencionan que esto era para página web de su patrón).

Ver this blog post

Además, la otra respuesta más arriba por thaBadDawg no funcionará cuando se especifican varios encabezados de host - vas a tener los errores que el PO menciona ("Esta colección ya contiene una dirección con esquema http ".)

No creo que ninguna de las soluciones mencionadas hasta ahora funcione, porque no parece que WCF permita que un único servicio sea accesible para un solo sitio con múltiples encabezados de host de todos los sitios. La única solución alternativa que pude encontrar para .Net 3.5 (y versiones anteriores) es crear un contrato diferente para cada uno de los encabezados de host, y usar ServiceHostFactory personalizado para usar el encabezado de host correcto según el contrato especificado. Esto no es para nada práctico. Aparentemente .Net 4.0 will resolve this issue.

+0

La otra solución es la mencionada por ** struhtanov **. Básicamente, todo lo que necesita hacer es crear diferentes puntos finales para cada host (no tiene que cambiar el contrato). – chenz

3

Me encontré con este problema hace varios días. En realidad, tengo la misma situación que Ryu describió originalmente en su pregunta. Tenemos un directorio virtual para muchos clientes, pero cada uno tiene su propio enlace. Como "http://company1.product.com", "http://company2.product.com" etc.

Solución descrita here funciona. Pero, ¿cuál es el precio? Deberíamos cambiar web.config cada vez que necesitemos agregar un nuevo enlace. Y también web.config debe contener el prefijo de ruta absoluta como <add prefix=”http://company1.product.com”/>.

Es posible evitar el primer problema. Escribí mi propia CustomHostFactory para el servicio WCF, donde agregué dinámicamente puntos finales. Y estos puntos finales los obtengo de enlaces IIS (hay una forma de obtener información de IIS).

Aquí es código de ejemplo:

protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses) 
{ 
    var serviceHost = base.CreateServiceHost(serviceType, baseAddresses); 
    var webHttpBinding = new WebHttpBinding(); 
    var serviceEndpoint1 = serviceHost.AddServiceEndpoint(typeof(IService), webHttpBinding, 
                 "http://company2.product.com/WCFService/Service.svc"); 

    var serviceEndpoint2 = serviceHost.AddServiceEndpoint(typeof(IService), webHttpBinding, 
               "http://company1.product.com/WCFService/Service.svc"); 

    var webHttpBehavior = new WebHttpBehavior(); 

    serviceEndpoint1.Behaviors.Add(webHttpBehavior); 
    serviceEndpoint2.Behaviors.Add(webHttpBehavior); 

    return serviceHost; 
} 

Y en lugar de codificar las direcciones URL de punto final, que sould recuperarlas de IIS. Pero ServiceHost se crea una vez cuando se inicia la aplicación. Entonces, si necesita agregar un nuevo enlace, debe reiniciar IIS. No es una solución para nosotros.

Es por eso que decidimos pasar a asmx (como se describe here). Y espere hasta la versión de Framework 4.0, donde deberían admitirse enlaces múltiples.

+0

Con .NET 4.0 ya no necesita especificar todos los encabezados de host en config, simplemente agregue '' como se describe en el blog de Rampo. Gracias por el enlace. –

0

Una solución simple que no implica ningún cambio de código o configuración es crear otro sitio web en IIS que apunte al mismo directorio físico y el mismo grupo de aplicaciones, pero con un enlace de encabezado de host diferente. Esto se puede hacer para tantos nombres de host diferentes como tenga.

Cuestiones relacionadas