2011-06-10 9 views
5

Tengo un servicio de Windows que utiliza un método de una biblioteca de clase con la misma solución asp.net. en la biblioteca de clases, tengo un método con la siguiente línea:HttpContext.Current.Server null

reader = XmlReader.Create(HttpContext.Current.Server 
      .MapPath("~/TestDevice/Data.xml"), settings); 

Cuando el control llega a esta línea. Obtengo excepción. Intenté depurar el código y encontré que cuando el servicio intenta acceder a este método, HttpContext.Current.Server es null. ¿Qué es la sintaxis alternativa?

He intentado acceder a este método de biblioteca de clases desde la aplicación web y funciona bien.

Por favor, sugiera la solución.

+0

¿Estás haciendo multihilo? –

+0

@Waqas no, no estoy haciendo multiprocesamiento – DotnetSparrow

+0

Ver http://stackoverflow.com/a/944267/37055 –

Respuesta

5

HttpContext.Current está volviendo nula debido a que su servicio de Windows no se está ejecutando bajo el paraguas de IIS o algún otro provder servidor web.

Sin embargo, puede encontrar el camino de la ejecución de su servicio utilizando la reflexión:

System.Reflection.Assembly.GetExecutingAssembly().Location 

^debe devolver la ruta de acceso del servicio de ejecución ..

+1

No necesito la ruta de ensamblaje sino que necesito la ruta de archivo. en realidad necesito la alternativa de esto: HttpContext.Current.Server.MapPath ("~/TestDevice/Data.xml") – DotnetSparrow

+0

Entonces, lo que está diciendo es que quiere que el servicio sepa la ubicación de un archivo de datos ubicado debajo de una red solicitud. Problema con eso es que la aplicación web podría moverse. Si desea que tanto un servicio como una aplicación web puedan tener acceso a la misma ubicación, es posible que desee definir esa ubicación de ruta en un archivo de configuración para cada aplicación, ambos apuntando al mismo lugar y almacenar sus datos en esa ubicación. ubicación en lugar de en el árbol de carpetas del sitio web. –

0

Es posible que cuando esté utilizando el servicio de Windows, ya no esté ejecutando una aplicación web, por lo tanto HttpContext y el servidor web no estén disponibles. Intente utilizar System.IO.File para la asignación, vea si eso lo lleva al directorio correcto.

Editar

private String yourFullPath = System.IO.Path.GetFullPath("/YourDirectory") + @"\"; 
+0

@vikp: sí, funciona con la ruta física. Cuál es la alternativa No quiero dar una ruta física en la biblioteca de la clase – DotnetSparrow

+0

No está dando un camino físico. Todo lo que tiene que hacer es especificar el nombre del directorio, que residirá en la raíz de su DLL. –

+0

@vikp: System.IO.file está dando error. ¿Qué es la sintaxis exacta? – DotnetSparrow

0

Este método funciona mucho mejor:

string baseDirectory = AppDomain.CurrentDomain.BaseDirectory;