2011-03-30 12 views
6

Estoy usando un servicio WCF creado con Visual Studio.Monotouch: Servicios WCF y manejo de excepciones

Estoy haciendo una llamada como GetDataAsync (param) para recuperar datos. En el controlador GetDataCompleted, estoy usando los datos recuperados.

El servicio funciona. A veces no puedo recuperar datos. En este caso, se produjo una excepción como la siguiente:

Exception in async operation: System.Net.ProtocolViolationException: The number of bytes to be written is greater than the specified ContentLength. 
    at System.Net.WebConnectionStream.CheckWriteOverflow (Int64 contentLength, Int64 totalWritten, Int64 size) [0x00038] in /Developer/MonoTouch/Source/mono/mcs/class/System/System.Net/WebConnectionStream.cs:546 

¿Cómo es posible obtener una excitación similar? La aplicación sigue funcionando pero la excepción se imprime en la consola. Creo que la excepción proviene de Channel u otra cosa.

Gracias de antemano.

+0

Oye, ¿has descubierto esto?Tengo un problema equivalente en el marco mono con las clases HttpWebRequest, WebRequest y WebClient que se ejecutan con mod_mono en Apache. El problema sólo se produce cuando la petición HTTP tiene un cuerpo (no si el cuerpo está vacío y ContentLength es 0). La primera petición después de reiniciar el servidor siempre tiene éxito, pero todas las solicitudes posteriores no tienen éxito y devuelve el error que usted describe. Por favor ayuda si tiene alguna información :-) Br. Morten – Maate

+1

¿Qué versión de MonoTouch se está utilizando? El mensaje anterior ** "Excepción en la operación asincrónica" ** solo se encuentra dentro del perfil ** MOONLIGHT ** por lo que no debe imprimir nada en la * consola *. – poupou

Respuesta

2

Lamentablemente, estas excepciones de WCF no se pueden atrapar en Monotouch en este momento. Esto parece ser un error conocido. Ver MonoTouch - WCF Services made by Silverlight tool - Can't catch exceptions

+0

Hmm ... Supongo que esto responde la pregunta, de ahí la recompensa. Sin embargo, mi problema real es la subparte del problema del OP que establece que esta excepción de protocolo ocurre aleatoriamente. Lo hace con la clase WebClient y con las clases (Webbet) (Http). Entonces, básicamente, no me importa si puedo atraparlo o no, no quiero que ocurra en absoluto. Lo resolví escribiendo un cliente HTTP simple directamente en la parte superior de System.Net.TcpClient. No es bonito, pero parece ser estable y funcionará para mí hasta que se solucione el error general. – Maate

0

Al usar WCF siempre es bueno intentar obtener la mayor visibilidad posible. Hay dos herramientas que uso a menudo. Ellos son el Editor Visor de seguimiento de WCF y WCF Config

  • SvcConfigEditor.exe
  • SvcTraceViewer.exe

Dependiendo si usted está en una máquina x64 o x84 y la versión de .Net que deberían ser ubicado cualquiera.

  • C: \ Archivos de programa \ Microsoft SDKs \ Windows \ v6.0A \ bin \
  • C: \ Archivos de programa \ Microsoft SDKs \ Windows \ v7.0A \ bin \
  • C: \ Program archivos (x86) \ Microsoft SDKs \ Windows \ v6.0A \ Bin
  • C: \ archivos de programa (x86) \ Microsoft SDKs \ Windows \ v7.0A \ Bin Mira lo

salida http://merbla.blogspot.com/2009/02/wcf-tools.html

2

Usted r pregunta es:

¿Cómo es posible detectar una excepción similar (rojo: ProtocolViolationException)?

En su solicitud de servicio, coger el ProtocolViolationException con el siguiente código:

catch (ProtocolViolationException ex) 
{ 
    // do something with your exception here 
    // for example, throw a FaultException that will be communicated to the client 
    throw new FaultException<ProtocolViolationException> 
     (ex, new FaultReason(ex.Message), new FaultCode("Sender")); 
} 

Para que esto se envía de vuelta al cliente correctamente, tendrá que configurar un atributo adicional sobre la operación contrato, como:

[OperationContract()] 
[FaultContract(typeof(ProtocolViolationException))] 

y luego, en el lado del cliente se puede anticipar esta excepción específica y manejarla con gracia, como:

catch (FaultException<ProtocolViolationException> ex) 
{ 
    Console.WriteLine("FaultException<>: " + ex.Detail.GetType().Name + " - " + ex.Detail.Message); 
} 

¿Eso responde su pregunta?