2009-04-26 24 views
66

Quiero obtener la carpeta de trabajo de una aplicación WCF. ¿Cómo puedo obtenerlo?¿Cómo obtener la ruta de trabajo de una aplicación wcf?

Si intento

HttpContext.Current.Request.MapPath(HttpContext.Current.Request.ApplicationPath) 

me sale una excepción de referencia nula (el objeto Http.Current es nulo).


Lo que quise decir con la carpeta de trabajo fue la carpeta donde se está ejecutando mi servicio WCF. Si fijo aspNetCompatibilityEnabled="true", me sale este error:

The server did not provide a meaningful reply; this might be caused by a contract mismatch, a premature session shutdown or an internal server error.

Respuesta

164

que necesita la misma información para mi IIS6 aplicación alojada en WCF y me encontré con que esto funcionó para mí:

string apPath = System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath; 

Como siempre, YMMV.

+2

Esta solución funcionó mejor para mí, recomiendo usarla en lugar de tener que realizar todo tipo de cambios en otras configuraciones ... –

+0

No tengo System.Web.Hosting, realmente no sé la razón por la cual. . . – nXqd

+1

@nXqd Está en System.Web.dll volviendo al marco 2.0 – ongle

3

Con el fin de hacer referencia a ASP.NET presenta como el objeto HttpContext, que necesita para ejecutar su aplicación WCF en modo de compatibilidad de ASP.NET. Este article explica cómo hacer esto.

31

Consulte la respuesta de ongle a continuación. Es mucho mejor que este.

actualiza después de más información

Los siguientes trabajó para mí. Lo probé con un nuevo servicio WCF alojado en IIS a través de un Service1.svc.

  1. Agregue <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/> a la configuración web. <system.serviceModel>..</ ..> ya existía.
  2. Agregue AspNetCompatibilityRequirementsAttribute al servicio con Modo Permitido.
  3. Usa HttpContext.Current.Server.MapPath("."); para obtener el directorio raíz.

A continuación se muestra el código completo para la clase de servicio. No hice cambios en la interfaz IService1.

[AspNetCompatibilityRequirements(RequirementsMode=AspNetCompatibilityRequirementsMode.Allowed)] 
public class Service1 : IService1 
{ 
    public void DoWork() 
    { 
     HttpContext.Current.Server.MapPath("."); 
    } 
} 

A continuación, un extracto de la web.config.

<system.serviceModel> 
    <!-- Added only the one line below --> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/> 

    <!-- Everything else was left intact --> 
    <behaviors> 
     <!-- ... --> 
    </behaviors> 
    <services> 
     <!-- ... --> 
    </services> 
</system.serviceModel> 

respuesta Antiguo

¿Qué quiere decir por la carpeta de trabajo? Los servicios de WCF se pueden alojar de diferentes maneras y con diferentes puntos finales, por lo que la carpeta de trabajo es ligeramente ambigua.

Puede recuperar la "carpeta de trabajo" normal con una llamada al Directory.GetCurrentDirectory().

HttpContext es un objeto ASP.Net. Incluso si WCF puede hospedarse en IIS, todavía no es ASP.Net y por esa razón la mayoría de las técnicas ASP.Net no funcionan de manera predeterminada. OperationContext es el equivalente de WCF de HttpContext. OperationContext contiene información sobre la solicitud entrante, respuesta saliente, entre otras cosas.

Aunque la manera más fácil podría ser ejecutar el servicio en ASP.Net compatibility mode al alternarlo en el web.config. Esto debería darle acceso al ASP.Net HttpContext. Sin embargo, lo limitará a * HttpBindings e IIS hosting. Para alternar el modo de compatibilidad, agregue lo siguiente a web.config.

<system.serviceModel> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/> 
</system.serviceModel> 
+0

Lo que quería decir con la "Carpeta de trabajo" era la ruta física donde mi servicio WCF estaba en marcha. Tengo un archivo xml allí y quiero leerlo. Directory.GetCurrentDirectory() no funciona, y cuando pruebo la configuración que dijiste sobre el modo de compatibilidad recibo este error: El servidor no proporcionó una respuesta significativa; esto podría deberse a una falta de coincidencia de contrato, un cierre prematuro de la sesión o un error interno del servidor. –

+0

Respuesta actualizada con código de muestra probado. –

+9

utiliza esto que funciona tanto con contexto ASPNET como sin System.Web.Hosting.HostingEnvironment.MapPath ("~/folder/file"); –

12

El aspNetCompatibilityEnabled = "true" debería haber resuelto mi problema, pero tengo este error:

The server did not provide a meaningful reply; this might be caused by a contract mismatch, a premature session shutdown or an internal server error.

resolví mi problema con la obtención de la ruta física de mi servicio WCF en marcha por la reciba de mi dominio aplicación actual:

AppDomain.CurrentDomain.BaseDirectory 
+1

Si ejecuta ServiceHost manualmente, solo AppDomain.CurrentDomain.BaseDirectory apunta a la fuente correcta. ¡Thx hombre! – mastak

20

Según lo que desee. Por lo general, quiero resolver una url como "~/carpeta/archivo". Esto es lo que funcionó.

System.Web.Hosting.HostingEnvironment.MapPath("~/folder/file"); 
+0

¡La mejor respuesta! gracias –

2

Uso HostingEnvironment.ApplicationPhysicalPath en WCF para encontrar su ruta física de la aplicación. Use el espacio de nombres usando System.Web.Hosting;

15

Más en general, estoy usando éste

AppDomain.CurrentDomain.BaseDirectory 
+0

+ uno para una solución sin System.Web – Filip

Cuestiones relacionadas