una - puede deberse a que el enlace del extremo de servicio no usa el protocolo http wcf
¿Cómo obtener la ruta de trabajo de una aplicación wcf? (7)
Quiero obtener la carpeta de trabajo de una aplicación WCF. ¿Cómo puedo obtenerlo?
Si intento
HttpContext.Current.Request.MapPath(HttpContext.Current.Request.ApplicationPath)
Obtengo 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 configuro aspNetCompatibilityEnabled="true"
, obtengo 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.
Dependiendo de lo que quieras Por lo general, quiero resolver una url como "~ / carpeta / archivo". Esto es lo que funcionó.
System.Web.Hosting.HostingEnvironment.MapPath("~/folder/file");
El aspNetCompatibilityEnabled = "true" debería haber resuelto mi problema, pero obtuve 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.
Resolví mi problema al obtener la ruta física de mi servicio WCF en ejecución obteniéndolo desde mi dominio de aplicación actual:
AppDomain.CurrentDomain.BaseDirectory
Más general, estoy usando este
AppDomain.CurrentDomain.BaseDirectory
Necesitaba la misma información para mi aplicación WCF alojada en IIS6 y descubrí que esto funcionaba para mí:
string apPath = System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath;
Como siempre, YMMV.
Para hacer referencia a las características de ASP.NET como el objeto HttpContext, debe ejecutar su aplicación WCF en el modo de compatibilidad ASP.NET. Este artículo explica cómo hacer esto.
Use HostingEnvironment.ApplicationPhysicalPath en WCF para encontrar la ruta física de su aplicación. Use el espacio de nombres usando System.Web.Hosting;
Por favor, vea la respuesta de ongle a continuación. Es mucho mejor que este.
Actualizado después de más información
Lo siguiente funcionó para mí. Lo probé con un nuevo servicio WCF alojado en IIS a través de un Service1.svc.
- Agregue
<serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
a la configuración web.<system.serviceModel>..</ ..>
ya existía. - Agregue
AspNetCompatibilityRequirementsAttribute
al servicio con Mode Allowed. - Use
HttpContext.Current.Server.MapPath(".");
para obtener el directorio raíz.
A continuación se muestra el código completo de 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(".");
}
}
Y a continuación se encuentra 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 anterior
¿Qué quieres decir con 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 a 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 forma más sencilla podría ser ejecutar el servicio en el modo de compatibilidad ASP.Net al alternarlo en el archivo 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>