Ajax header basic auth: el tiempo de espera de solicitud no funciona en wp8

Actualmente estoy escribiendo un control remoto para el VLC Media Player. Utilizo la interfaz web-http para conectarme y controlar el servidor. Desde la versión 2.1.0 VLC requiere que se establezca una contraseña. Esto en sí no es un problema. Lo resolví con la siguiente Ajax-Request.

checkConnection = function(id, folder){ $.ajax({ url: 'http://' + data.ip + ":" + data.port + '/requests/status.xml', headers: { "Authorization" : "Basic " + data.authorization }, timeout: 3000, success: function (data, status, jqXHR) { //Yeah do stuff } }, error: function(data){ //Ohh, do stuff } }); }; 

Si me conecto a la interfaz http de VLC usando mi computadora, hay una ventana emergente estándar que me pide el nombre de usuario y la contraseña. Mi problema ahora mismo es que si el token en data.authorization es incorrecto, la aplicación (usando el teléfono) falla. Si se probó con Ripple (usando Chrome), se muestra la ventana emergente mencionada, pero el tiempo de espera funciona y mi manejo de errores se activa. Este no es el caso en mi Windows Phone: aquí se cuelga mi aplicación (como se mencionó). Sospecho que, dado que se trata de una vista web, WP intenta mostrar la ventana emergente, pero falla. Entonces, de nuevo, el tiempo de espera debería entrar en juego?

¿Alguno de ustedes tuvo el mismo problema y, de ser así, cómo lo resolvieron?

Finalmente resuelto. Fue bastante fácil y solo se requería escribir un complemento en C #. Adjuntaré el código a cualquiera que pueda encontrar el mismo problema.

 using System; using System.IO; using System.Net; using System.Runtime.Serialization; using System.Text; using System.Windows.Threading; using WPCordovaClassLib.Cordova; namespace WPCordovaClassLib.Cordova.Commands { public class BasicAuth : BaseCommand { //Create timer to control timeout DispatcherTimer timeoutTimer = new DispatcherTimer(); WebClient webClient = new WebClient(); public BasicAuth(){ timeoutTimer.Interval = TimeSpan.FromSeconds(5); timeoutTimer.Tick += new EventHandler(timeout); timeoutTimer.Start(); } public void get(string options) { //Parse data that gets passed into the plugin string[] passedData = JSON.JsonHelper.Deserialize(options); string ip = passedData[0]; string port = passedData[1]; string username = passedData[2]; string password = passedData[3]; try { webClient.DownloadStringCompleted += new DownloadStringCompletedEventHandler(webClient_DownloadStringCompleted); string credentials = String.Format("{0}:{1}", username, password); byte[] bytes = Encoding.UTF8.GetBytes(credentials); string base64 = Convert.ToBase64String(bytes); string authorization = String.Concat("Basic ", base64); webClient.Headers["Authorization"] = authorization; string url = //your url here var uri = new Uri(url); webClient.DownloadStringAsync(uri); } catch (Exception ex) { System.Diagnostics.Debug.WriteLine(ex.Data); DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, "")); timeoutTimer.Stop(); } } void webClient_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) { try{ DispatchCommandResult(new PluginResult(PluginResult.Status.OK, e.Result)); //e.Result will fail if the server couldn't be contacted } catch{ DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, "")); } } private void timeout(Object sender, EventArgs e) { webClient.CancelAsync(); //Cancel Async download timeoutTimer.Stop(); //Stop timer from beeing executed again } } } 

Aquí está el bit que llamarías desde tu JavaScript:

 cordova.exec(connectionSuccess, connectionError, "BasicAuth", "get", [data]);