2009-12-01 13 views
5

Tengo una aplicación Silverlight 3, que el 95% de las veces solicita datos de un Servicio WCF (en la misma aplicación web) y los muestra.Silverlight 3 Servicio WCF `CommunicationException` Servidor devuelto error: NotFound

Esto ocurre con poca frecuencia, por lo general si llego al servicio un montón de veces rápidamente, pero a veces sucede en una única solicitud solitaria.

De vez en cuando, si solicito muchas transacciones en un período corto, obtengo una de dos excepciones, ambas ocurren en el archivo Reference.cs en el EndMyMethod(System.IAsyncResult result).

Existen algunos métodos, y las excepciones se producen en muchos de ellos. El primero, es un TimeoutException() que entiendo y tiene sentido, el segundo, que no entiendo es el "CommunicationException() no fue manejado por el código del usuario: el servidor remoto devolvió un error: NotFound".

He puesto try..catch bloquea tanto cerca de la .MyMethodAsync() y en el controlador para MyMethodCompleted tanto en vano, ya que se produce la excepción en el archivo Reference.cs generado.

Cualquier ayuda es muy apreciada.

actualización

Reference.cs- generada por "Agregar referencia de servicio"

public System.IAsyncResult BeginTogglePicked(string ID, string toggle, System.AsyncCallback callback, object asyncState) 
{ 
    object[] _args = new object[2]; 
    _args[0] = ID; 
    _args[1] = toggle; 
    System.IAsyncResult _result = base.BeginInvoke("TogglePicked", _args, callback, asyncState); 
    return _result; 
} 

public void EndTogglePicked(System.IAsyncResult result) 
{ 
    object[] _args = new object[0]; 
    // This is the line where the Exception is Thrown 
    base.EndInvoke("TogglePicked", _args, result); 
} 

Llamar código - pickedIDs es una lista de cadenas, y userIDSelecting es una cadena definido en la parte superior del procedimiento. El controlador de eventos mdc_TogglePIckedCompleted está vacío en este momento.

MapDataClient mdc = new MyDataClient(); 
mdc.TogglePickedCompleted += new EventHandler<System.ComponentModel.AsyncCompletedEventArgs>(mdc_TogglePickedCompleted); 

foreach (string id in pickedIDs) 
{ 
    mdc.TogglePickedAsync(id, userIDSelecting, mdc); 
} 

Actualización 2

Ésta es la "InnerException" de la CommunicationException: System.Net.WebException: The remote server returned an error: NotFound.

No estoy seguro si esto es más útil, ya que no dio detalles adicionales. Como dije, esto sucede intermitentemente no cada vez que llamo a un método de servicio. También me gustaría señalar que la misma llamada funcionará a veces y no a otras. Estoy empezando a pensar que este problema se debe a que IIS no responde mis llamadas de servicio, ¿no?

Actualización 3

Cuando me refiero a intermiently, quiero decir Truel intrmitent. Esto solo puede ocurrir una sola vez en la sesión de un usuario, y solo puede ocurrir en una de cincuenta sesiones. No es una cita de todo o nada. La aplicación de llamada está alojada en la misma "web" como el Servicio WCF, por lo que no creo que clintaccesspolicy.xml sea el problema, pero podría estar equivocado.

+0

Publique el código para que podamos examinarlo. –

+0

¿El código del 'Reference.cs' generado, mi código de llamada, o ambos? – Nate

Respuesta

4

El mensaje que está recibiendo son probablemente una cortina de humo :-(

Cuando se producen excepciones de servicio WCF interna, éstos siempre se manifiestan como el servidor no encontrado excepciones en el interfaz de usuario de Silverlight. esto se debe a la respuesta HTTP es de tipo 500. el mejor artículo que he leído en esta era de David Betz - http://www.netfxharmonics.com/2008/11/Understanding-WCF-Services-in-Silverlight-2 (esto fue escrito para SL2, pero los conceptos todavía se mantiene para SL3 Además, algunos de sus enfoques son para los puristas -. ej "NUNCA" utilizando las funciones Agregar referencia de servicio de VS; no es necesario que siga todos sus consejos ;-))

De todos modos, volviendo a su pregunta, debe convertir el tipo de respuesta a 200 y analizar la excepción en el mensaje. Esto se puede hacer usando un MessageInspector (en el servicio y la aplicación SL).

Algunos de estos enfoques puede parecer bastante desalentador - tomar algún tiempo para entender esto - es el concepto fundamental para WCF -> < SL aplicaciones, y tiene sentido una vez que lo consigue :-)

Hemos utilizado esto con mucha de éxito desde el comienzo del año, así que si necesitas más ayuda con esto solo házmelo saber.

0

¿Su servicio devuelve los detalles de la excepción al cliente? Por defecto no lo hace. Puede agregar el siguiente atributo a su clase de servicio.

[ServiceBehavior(IncludeExceptionDetailInFaults=true)] 
public class MyService ... 

Es posible que encuentre algún tipo de excepción del lado del servidor que no sea visible para el cliente.

+0

No tengo ese código, pero en el archivo web.config, se me devolvieron los detalles de la excepción. Tendré que comprobar qué es la "InnerException", si es algo. – Nate

+0

Pregunta actualizada con contenido de InnerException. – Nate

0

Asegúrese de que tiene un archivo clientaccesspolicy.xml. De lo contrario, puede obtener ese error porque no se puede encontrar el archivo de política.

0

que tenía exactamente el mismo problema que tú - pesadilla absoluta, sería trabajar a veces y luego simplemente parar.

Después de leer su post anterior Seguí buscando información clientaccesspolicy y encontramos este (no recuerdo dónde), pero lo uso y ahora funciona bien!

esperan que el mismo es bueno para ti :) Mi archivo faltaba el detalle adicional en la sección de permitir que -desde.

<?xml version="1.0" encoding="utf-8" ?> 
<access-policy> 
    <cross-domain-access> 
    <policy> 
     <allow-from http-request-headers="*"> 
     <domain uri="http://*" /> 
     <domain uri="https://*" /> 

     </allow-from> 


     <grant-to> 
     <resource include-subpaths="true" path="/"/> 
     </grant-to> 
    </policy> 
    </cross-domain-access> 
</access-policy> 
+0

Pregunta de actualización, no creo que sea una política de acceso de cliente, ya que la aplicación SL y WCF están en la misma aplicación web asp.net. ¿Podría ser este el problema? – Nate

1

¿Puedo recomendar siempre, siempre teniendo Fiddler en funcionamiento cuando se está trabajando con Silverlight y WCF?

Cuestiones relacionadas