2009-11-30 3033 views
9

Tengo un servicio WCF que se ejecuta en IIS que llama a una función en una biblioteca de clase donde httpContext está disponible. ¿Cómo puedo obtener dinámicamente la URL del sitio web, esto también puede ser un directorio virtual?WCF Service, ¿cómo obtener la URL del sitio web desde una biblioteca de clase?

+0

la dirección URL del servicio WCF o la dirección URL del sitio que es la fuente de la HttpContext? – Russell

+0

URL para el sitio que aloja el servicio WCF ...por ejemplo: http: // localhost/virtualDirectory de http: //localhost/virtualDirectory/myService.svc –

+0

¿Qué versión de IIS? IIS 6 o 7 o 7.5? ¿Está implementado WAS? –

Respuesta

4

Puede crear un ServiceHostFactory que inicia su host de servicio de forma manual, luego almacena la dirección de punto final en una clase estática para ser utilizada por su aplicación. Aquí está un ejemplo sencillo:

(en su myService.svc):

<% 
@ServiceHost 
Service="MyNamespace.MyService" 
Factory="MyNamespace.MyServiceHostFactory" 
    %> 

(en sus MyServiceHostFactory.cs):

/// <summary> 
/// Extends ServiceHostFactory to allow ServiceHostFactory to be used. 
/// </summary> 
public class MyServiceHostFactory : ServiceHostFactory 
{ 
    /// <summary> 
    /// Creates a new ServiceHost using the specified service and base addresses. 
    /// </summary> 
    /// <param name="serviceType"></param> 
    /// <param name="baseAddresses"></param> 
    /// <returns></returns> 
    protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses) 
    { 
     ServiceHost host; 
     host = new ServiceHost(serviceType, baseAddresses); 

     MyGlobalStaticClass.Address = baseAddresses[0]; // assuming you want the first endpoint address. 

     return host; 
    } 

(En sus MyGlobalStaticClass.cs):

public static string Address = ""; 
2

No estoy demasiado caliente en WCF ya que estoy más acostumbrado a .Net 2.0, pero ¿esto lo haría?

HttpContext.Current.Request.Url.ToString() 

Debería darle la url de la solicitud de llamada. El problema aquí es que posiblemente podría tener múltiples dominios o directorios virtuales apuntando al mismo servicio y solo le dará la url especificada por el cliente. Sin embargo, si tiene múltiples puntos de entrada, de todos modos no hay una url "uno".

+1

Esto también supone que el enlace WCF es basicHttpBinding o un tipo de enlace HTTP (por ejemplo, netTcpBinding no tiene un HttpContext). – Russell

25

Voy a empezar asumiendo que estás usando HTTP - estoy seguro de que puedes ajustar el enfoque según en lo que dictan tus condiciones específicas Traté de obtener una respuesta usando HttpContext y descubrí que el valor era nulo cuando funcionaba con Cassini, así que probé un enfoque alternativo.

System.ServiceModel.OperationContext contiene el contexto de solicitud adecuado. Puede seguir la solicitud hasta el mensaje de solicitud real y borrar el encabezado.

Uri requestUri = System.ServiceModel.OperationContext.Current.RequestContext.RequestMessage.Headers.To; 
3

Actualmente estoy trabajando en WCF REST Service y tengo el mismo tipo de requisito. Necesito el servicio Host URL en mi único método. A continuación se detallan las diferentes formas de obtener WCF REST Service Host/URL en la biblioteca de clases.

Puede usar la clase WebOperationContext que está disponible en el espacio de nombres System.ServiceModel.Web para obtener la URL del servicio. Tenga en cuenta que esta clase es solo para WCF REST Service.

  1. WebOperationContext.Current.IncomingRequest.Headers["host"] - Da servicio nombre de host

  2. WebOperationContext.Current.IncomingRequest.UriTemplateMatch.BaseUri.Host - da servicio nombre de host

  3. WebOperationContext.Current.IncomingRequest.UriTemplateMatch.BaseUri.AbsoluteUri - Da Full Service Url

  4. WebOperationContext.Current.IncomingRequest.UriTemplateMatch.RequestUri.AbsoluteUri - Da Full Service Url

Puede obtener más información acerca de la clase de WebOperationContextMSDN

+1

Para mí, UriTemplateMatch siempre es nulo, así que no puedo usar 3/4 de estas sugerencias. –

Cuestiones relacionadas