在Windows Phone上使用Phonegap处理401未经授权的错误

3
我正在使用Windows Phone 7上的PhoneGap创建一个需要在服务器上进行身份验证的应用程序。当我们使用正确的用户名和密码登录时,会收到200状态,并且一切正常。但是,如果我们在登录或密码上犯了错误,服务器会发送401错误。这会使我的应用程序冻结。我需要杀死它并重新启动它。所以不是很方便。
我在我的计算机上使用Fiddler检查响应,手机接收到401错误,并且我在我的代码中处理了这个错误。这在我的其他平台(Android和iOS)上都起作用。
因此,我想知道如何处理这个错误。也许我可以更改Windows Phone项目中的cs文件来处理此错误。
欢迎提供任何帮助。
以下是代码:
$.support.cors = true;
    $.ajax({
        type: "POST",
        dataType: "HTTP/1.1",
        url: 'https://xxx.xxx-xxx.com/issue/wrap',
        data: data,
        cache: 'false',
        async: false,
        error: function (data) {
            console.log(data);
            console.log("error");
            //navigator.notification.alert(data);
        },
        complete: saveToken
    });

谢谢


你是如何进行身份验证的? - Enoque Duarte
3个回答

2

我遇到了同样的问题,唯一的解决方案是实现一个Phonegap插件。

这是我使用的C#代码:

namespace WPCordovaClassLib.Cordova.Commands
{
    [DataContract]
    public class PhonegapWindowsPhonePostObject
    {
        [DataMember(IsRequired = false, Name = "yourParamName1")]
        public string yourParam1;

        [DataMember(IsRequired = false, Name = "yourParamName2")]
        public string yourParam2;
    }

    public class PhonegapWindowsPhonePost: BaseCommand
    {
        public void post(string options)
        {
            PhonegapWindowsPhonePostObject pwppo = JSON.JsonHelper.Deserialize<PhonegapWindowsPhonePostObject>(options);

            try
            {
                System.Windows.Deployment.Current.Dispatcher.BeginInvoke(() =>
                {
                    var data = "YOUR DATA STRING HERE"; //use the pwppo object to retrieve your parameters
                    var url = "URL OF THE SERVICE HERE";


                    WebClient wc = new SharpGIS.GZipWebClient();
                    var URI = new Uri(url);
                    wc.Encoding = Encoding.UTF8;
                    wc.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded";
                    wc.UploadStringCompleted += new UploadStringCompletedEventHandler(wc__UploadStringCompleted);
                    wc.UploadStringAsync(URI, "POST", data);
                });

            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
        void wc__UploadStringCompleted(object sender, UploadStringCompletedEventArgs e)
        {
            try
            {
                if (e.Result != null)
                    this.DispatchCommandResult(new PluginResult(PluginResult.Status.OK, e.Result));
                else
                    this.DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, "Error 401"));
            }
            catch (Exception ex)
            {
                this.DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, ex.Message));
                // no http status code available
            }
        }
    }
}

下面是从你的应用程序调用插件的JavaScript代码:

function loginToWebService(yourParam1, yourParam2) {

    var options = { "yourParamName1": yourParam1, "yourParamName2": yourParam2};
    cordova.exec(success, error,"PhonegapWindowsPhonePost","post", options);
}

我希望这能对你有所帮助。

注意:与发布说明相反,Phonegap 2.8版本并没有解决这个问题...

再见!


希望这个问题能够通过Phonegap或Microsoft解决,如果是由于IE引起的。 - Antoine
我在cordova问题跟踪器上开了一个问题,因为我遇到了类似/相同的问题:https://issues.apache.org/jira/browse/CB-4000?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13693241#comment-13693241 - Thomas Kremmel
我甚至在使用Cordova 3.1时遇到了麻烦 - 我在这里发布了我的解决方案http://stackoverflow.com/a/20306485/1994642。这也是一个插件。 - stiller_leser

0

嗨,你正在进行身份验证吗?

如果你正在使用XMLHttpRequest(),例如:var request = new XMLHttpRequest();

尝试检查类似这样的内容:console.log("status: " + request.status);

如果看起来可以工作,你可以使用:

if (request.status == 401) {
    // blabla
return;
}

我已经像这样处理错误了。但问题是当返回401时,应用程序会冻结。我们无法在JavaScript代码中处理响应。 - dpfauwadel
好的,那就抱歉了;不知道;冷静一点,弄些爆米花。 - Enoque Duarte
你尝试过在请求上使用try catch包装吗?-tryception:D - Enoque Duarte
为什么你不让服务器端返回像“拒绝”这样的字符串,而不是错误? - Enoque Duarte
我正在尝试查找文档,但基本上PhoneGap无法捕获401状态响应。 为此,我在我的登录尝试中实施了一个10秒超时,然后只是“假设”如果它超时了,则是错误的用户名/密码。真的希望Cordova能够解决这个问题! - ganders

0

过去几个月我一直遇到这个问题,最后终于找到解决办法。

首先,我们使用的临时解决方法是在请求上实现了一个超时期限。这虽然有效,但返回的响应总是404错误。我们不知道它是否真的是认证失败,还是我们的服务出现了问题。对于我们的系统来说,这个临时解决方法是不能接受的。

最后,在经过多次搜索后,我找到了实际的问题所在。

当返回一个401错误时(即基本身份验证失败),会在响应中添加一个名为"WWW-Authenticate"的头部。这告诉浏览器提示用户尝试登录。iOS webview不知道如何处理这个头部信息,所以才导致应用程序卡住。

从你的服务端,你只需要移除"WWW-Authenticate"头部,就应该能够在错误函数中看到401错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接