Conexiones concurrentes a un archivo XML

08/11/2005 - 01:50 por Zenkius | Informe spam
Hola amigos!

Tengo un problema con un sitio web que estoy desarrollando. Pues resulta que
cuando se carga la página principal del sitio guardo datos del cliente que
hace la petición en un archivo XML, pero el problema que tengo es cuando
varios usuarios abren al mismo tiempo el sitio a algunos le devuelve una
página con el error: "The process cannot access the file
"C:\inetpub\wwwroot\file.xml" because it is being used by another process." y
esto debe ser pq el proceso de IIS está guardando los datos de uno de los
usuarios en el XML y tiene el archivo bloqueado con acceso exclusivo.

Lo que quiero saber es si existe alguna forma de que se puedan guardar datos
en el archivo xml de forma simultanea para que no devuelva este error?

Cualquier ayuda les agradeceré mucho, pq he cambiado el código C# varias
veces, buscando otras vías, pero no encuentro manera alguna de que me
funcione como quiero.

Saludos y muchos Zenkius!!!

Preguntas similare

Leer las respuestas

#1 JuanCri
08/11/2005 - 12:54 | Informe spam
Lo único que se me ocurre es que pongas un lock dentro del método que
está guardando el archivo. Por ejemplo:

public void GuardarDatos (string dato)
{
lock (this)
{
// abrir xml
// ...
// guardar
// ...
// cerrar xml
// ...
}
}


Atte,
Juan C. Olivares
www.juancri.com
Respuesta Responder a este mensaje
#2 Octavio Hernandez
08/11/2005 - 19:54 | Informe spam
JuanCri,

Tu idea está en la línea correcta, pero así como está creo que no
funcionaría. El problema es que en las aplicaciones ASP.NET para cada
petición de página se genera una NUEVA INSTANCIA de la clase de la página;
en tu código 'this' apuntaría cada vez a un objeto distinto y no habría
sincronización. Lo correcto según este artículo

http://msdn.microsoft.com/library/d...032003.asp

es definirse un objeto estático dentro de la clase de la página y utilizarlo
como objeto de sincronización:

public class MiPagina: Page
{
private static Object objetoSincronizacion = new Object();

public void GuardarDatos (string dato)
{
lock (objetoSincronizacion)
{
// abrir xml
// ...
// guardar
// ...
// cerrar xml
// ...
}
}

Slds - Octavio


"JuanCri" escribió en el mensaje
news:
Lo único que se me ocurre es que pongas un lock dentro del método que
está guardando el archivo. Por ejemplo:

public void GuardarDatos (string dato)
{
lock (this)
{
// abrir xml
// ...
// guardar
// ...
// cerrar xml
// ...
}
}


Atte,
Juan C. Olivares
www.juancri.com
Respuesta Responder a este mensaje
#3 JuanCri
08/11/2005 - 20:20 | Informe spam
Sip, yo suponia que esta clase era a nivel de aplicacion y es una
instancia unica.

Atte,
Juan C. Olivares
www.juancri.com
Respuesta Responder a este mensaje
#4 Miguel Angel Campos
09/11/2005 - 09:37 | Informe spam
Otra posible solución que he visto en otras ocaciones es utilizar el mismo
tipo del objeto:

lock(this.GetType())
{
}

De todas formas yo tiraría mejor por capturar la excepción que se produce al
intentar acceder al fichero XML, y reintentar varias veces hasta conseguir
completar la operación. Esta solución es mas escalable, puesto que la
solución del bloqueo solo aplica a un determinado proceso en una sola
máquina, no en el caso de utilizar varios servidores en una granja.
Un Saludo,

Miguel Angel Campos
MCAD.NET

"Octavio Hernandez" escribió en el mensaje
news:%
JuanCri,

Tu idea está en la línea correcta, pero así como está creo que no
funcionaría. El problema es que en las aplicaciones ASP.NET para cada
petición de página se genera una NUEVA INSTANCIA de la clase de la página;
en tu código 'this' apuntaría cada vez a un objeto distinto y no habría
sincronización. Lo correcto según este artículo


http://msdn.microsoft.com/library/d...032003.asp

es definirse un objeto estático dentro de la clase de la página y
utilizarlo como objeto de sincronización:

public class MiPagina: Page
{
private static Object objetoSincronizacion = new Object();

public void GuardarDatos (string dato)
{
lock (objetoSincronizacion)
{
// abrir xml
// ...
// guardar
// ...
// cerrar xml
// ...
}
}

Slds - Octavio


"JuanCri" escribió en el mensaje
news:
Lo único que se me ocurre es que pongas un lock dentro del método que
está guardando el archivo. Por ejemplo:

public void GuardarDatos (string dato)
{
lock (this)
{
// abrir xml
// ...
// guardar
// ...
// cerrar xml
// ...
}
}


Atte,
Juan C. Olivares
www.juancri.com


Respuesta Responder a este mensaje
#5 Octavio Hernandez
09/11/2005 - 23:41 | Informe spam
Hola MA,

- Yo también he usado GetType() para esto alguna que otra vez, pero
precisamente en el artículo cuyo enlace he puesto antes te recomiendan que
no utilices ese objeto Type, sino un objeto estático definido por tí.

- Creo que tienes razón con respecto al tema de la escalabilidad a varios
servidores.

Slds - Octavio


"Miguel Angel Campos" <SPAMmacampos ARRUBA .idesarrollaSPAM.com> escribió en
el mensaje news:
Otra posible solución que he visto en otras ocaciones es utilizar el mismo
tipo del objeto:

lock(this.GetType())
{
}

De todas formas yo tiraría mejor por capturar la excepción que se produce
al intentar acceder al fichero XML, y reintentar varias veces hasta
conseguir completar la operación. Esta solución es mas escalable, puesto
que la solución del bloqueo solo aplica a un determinado proceso en una
sola máquina, no en el caso de utilizar varios servidores en una granja.
Un Saludo,

Miguel Angel Campos
MCAD.NET

"Octavio Hernandez" escribió en el mensaje
news:%
JuanCri,

Tu idea está en la línea correcta, pero así como está creo que no
funcionaría. El problema es que en las aplicaciones ASP.NET para cada
petición de página se genera una NUEVA INSTANCIA de la clase de la
página; en tu código 'this' apuntaría cada vez a un objeto distinto y no
habría sincronización. Lo correcto según este artículo


http://msdn.microsoft.com/library/d...032003.asp

es definirse un objeto estático dentro de la clase de la página y
utilizarlo como objeto de sincronización:

public class MiPagina: Page
{
private static Object objetoSincronizacion = new Object();

public void GuardarDatos (string dato)
{
lock (objetoSincronizacion)
{
// abrir xml
// ...
// guardar
// ...
// cerrar xml
// ...
}
}

Slds - Octavio


"JuanCri" escribió en el mensaje
news:
Lo único que se me ocurre es que pongas un lock dentro del método que
está guardando el archivo. Por ejemplo:

public void GuardarDatos (string dato)
{
lock (this)
{
// abrir xml
// ...
// guardar
// ...
// cerrar xml
// ...
}
}


Atte,
Juan C. Olivares
www.juancri.com






Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida