阿贾克斯头基本身份验证:请求超时不工作的WP8(Ajax header basic auth: re

2019-10-29 20:53发布

我目前正在写的VLC媒体播放器遥控。 我使用http-webinterface连接和控制服务器。 由于2.1.0版VLC需要设置密码。 这本身是没有问题的。 我用下面的Ajax请求解决它

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
    }
  });
};

如果我连接到使用我的电脑VLC HTTP接口有这个标准弹出问我的用户名和密码。 我的问题现在的问题是,如果在data.authorization令牌是错误的,应用程序(使用手机)崩溃。 如果有波纹(使用Chrome)中提到的弹出窗口显示,但超时工作,在我的错误处理踢测试这不是对我的Windows Phone的情况下 - 在这里我的应用程序挂起(如前所述)。 我怀疑,既然是网页视图WP试图显示弹出,但失败。 话又说回来,超时应该踢?

难道你们有同样的问题,如果是的话你是怎么解决的呢?

Answer 1:

终于解决了。 这是很容易的,只需要编写C#中的插件。 我将连接的代码,任何人谁可能会遇到同样的问题。

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<string[]>(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
    }
}
}

这里是你想从你的JavaScript调用位:

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


文章来源: Ajax header basic auth: request timeout not working on wp8