2011-03-25 6 views
9

Este error parece que tirar para cualquier cosa que va mal en la función de JavaScript que se llama:¿Por qué WP7 WebBrowser llamada invocación de InvokeScript Error: 80020101?

SystemException was unhandled  
An unknown error has occurred. Error: 80020101. 

estoy usando el javascript como una interfaz para un motor de aplicación Web, y tengo dos llamadas que están trabajando bien, la carga y volver JSON de una llamada AJAX, que se parecen a esto:

En Silverlight:

MyBrowser.InvokeScript("getData", "/Me/Feed?numberOfResults=-1", "MyFeed"); 

el Javascript cargado en el WebBrowser

function getData(url, context) { 
    $.ajax({ 
     url: url, 
     dataType: 'jsonp', 
     success: function (result) { 
      callback(result, context); 
     } 
    }); 
} 

Pero más tarde Quiero publicar los datos de vuelta al servidor, y yo estoy haciendo lo mismo:

MyBrowser.InvokeScript("postData", "thedata", "CreatePost"); 

function postData(payload, context) { 
    $.ajax({ 
     type: "POST", 
     url: "/Post/Create?" + tz(), 
     data: payload, 
     dataType:"json", 
     success:function (result) { 
      callback(result, context); 
     } 
    }); 
} 

ahora consigo la excepción.

Lo que es realmente extraño es que puedo llamar inmediatamente la función desde el script y publicarlo en el back-end sin problemas.

postData("sampledata", "PostTest"); 

Al principio parecía que la única diferencia era que se trataba de un GET y el otro un poste, así que copiaron el Ajax llamada entrar en la segunda llamada (lo que ocurre en la entrada del usuario, donde el primero de ellos ocurrió el carga). El resultado fue el mismo (obtengo el mismo error). Puedo obtener otros comandos para disparar en el javascript de este evento, siempre y cuando no contengan llamadas ajax (aparece). Entonces, podría pensar que es una cuestión de tiempo, así que moví la llamada arriba donde llamé a los otros InvokeScripts que están funcionando, y aún no funciona (la misma excepción).

También traté de llamarlo por un hilo separado, usando Dispatcher.BeginInvoke para una buena medida y sin dados.

Dispatcher.BeginInvoke(() => 
{ 
    MyBrowser.InvokeScript("postData", "thedata", "CreatePost"); 
}); 

Estoy completamente desconcertado. Parece que hay cierta consistencia, en el sentido de que si una llamada falla, fallará siempre, pero no puedo decir cuál es la diferencia entre las llamadas que funcionan y las que fallan.

¿Alguien puede decirme qué estoy haciendo mal, o qué es lo que no entiendo sobre el uso de InvokeScript y Ajax juntos?

Gracias!

[EDIT - la adición de esta línea (fue en los comentarios) porque yo estoy haciendo la pregunta mucho]

He trabajado en esto durante 6 horas y esto es lo que estoy viendo:

  • hay 2 eventos diferentes desde los que realizo estas llamadas; 1) cuando la carga de la página se ha completado en el control de explorador, 2) cuando un usuario pulsa el botón de mi "post"
  • el error no se produce cuando la llamada Ajax es un GET desde el evento de carga
  • se produce el error cuando se llama a la misma llamada GET desde el evento de usuario
  • el error también oCURRE cuando se llama a la llamada Ajax usando la POST del evento de carga
  • el error no se produce cuando se llama a una función que no realice ningún Ajax por parte del usuario evento
+0

¿Hace esto con una XMLHTTPRequest natural? – mattsven

+0

¿La página está completamente cargada cuando llama a InvokeScript? ¿Podría ser que la función $ .ajax aún no está cargada? –

+0

Hola, NeXXeuS: no estoy seguro de entender lo que estás sugiriendo. ¿Quiere decir que debería intentar eliminar el uso de Javascript como interfaz de la aplicación web y acceder a él directamente? Principalmente, mi equipo no quería reescribir todas sus cosas solo para este cliente, y la otra cosa es que este enfoque proporciona la autenticación de Facebook existente y evita todos los problemas de Silverlight entre dominios – Subcreation

Respuesta

3

Ver el trabajo GET con JSONP, y el POST no funciona en absoluto, parece implicar que puede estar pasando de dominio cruzado? Normalmente en el mismo dominio no es necesario usar JSON * P *.

así que yo creo que es una violación de la política del mismo origen

+0

Sí, resultó que aunque mi página estaba en el mismo dominio que el servicio, estaba cargando javascript desde otro lugar y esto creó una situación entre dominios. Gracias, Dan! – Subcreation

6

Obtendrá el error 80020101 si el java el método de secuencia de comandos no se puede encontrar o th JS arroja un error.

En términos de encontrar el método, el control coincidirá exactamente con la firma. Este no es el comportamiento estándar de JavaScript, así que ten cuidado con esto.

Tenga cuidado con el almacenamiento en caché de la página (y su contenido) dentro del control del navegador ya que esto atrapa a mucha gente. :(

+0

Gracias, Matt. Eso también lo entendí, pero puede ver en mi código de muestra que el nombre y la firma de la función son idénticos; "postData", tomando 2 params. Soy consciente del almacenamiento en caché de la página: lo borro antes de cada prueba. – Subcreation

+0

@Nathan Roberton cambia el contenido del método para identificar dónde está el problema. Haga que 'postData' haga algo que definitivamente funcione para asegurarse de que no sea un problema de interoperabilidad. También puede tratarse de un problema de jQuery, ya que AFAIK no es totalmente compatible con IE7Mobile. –

+0

Gracias, Matt - He trabajado en esto durante 6 horas y esto es lo que estoy viendo: - hay 2 eventos diferentes desde los que hago estas llamadas; 1) cuando la carga de la página se ha completado en el control del navegador, 2) cuando un usuario toca mi botón "publicar" - el error NO ocurre cuando la llamada Ajax es un GET del evento de carga - el error Ocurre al llamar la misma llamada GET del evento de usuario - el error TAMBIÉN OCURRE cuando se llama a la llamada Ajax utilizando POST desde el evento de carga - el error NO ocurre cuando se llama a una función que no intenta ningún Ajax del evento de usuario. – Subcreation

0

que acaba de arreglar un problema similar

es un poco extraño ... requiere:.. 1. pasar los parámetros de la función javascript como una cadena delimitada por comas 2. Analizando la cadena en javascript usando split() 3. Crear una cadena de la expresión (es decir llamada de función con los parámetros) 4. Realizando un eval() en la expresión de cadena.

Supongo que también podría pasar una cadena que evalúa en una matriz de JavaScript.

Tom

0

El único problema (como me he enfrentado a la misma) debido al hecho de que el control del explorador web no se carga y función javascript está siendo llamado.

Como en una de las respuestas, se ha indicado.

Cuestiones relacionadas