Обрабатывать 401 несанкционированную ошибку на Windows Phone с PhoneGap
Я создаю приложение с PhoneGap на Windows Phone 7, которые требуют аутентификации на сервере. Когда мы регистрируемся с правильным именем пользователя и паролем, мы получаем статус 200. И все работает. Но если мы допустим ошибку в логине или пароле, сервер вернет нам ошибку 401. Это заморозить мое приложение. Мне нужно убить его и перезапустить. Так что не очень практика.
Я проверяю ответ с помощью fiddler на моем компьютере, и телефон получает ошибку 401, и я управляю этой ошибкой в своем коде. это работает на моей другой платформе (Android и IOS).
Поэтому я хотел бы знать, как я могу справиться с этой ошибкой. Может быть, я могу изменить файл CS в проекте Windows Phone для обработки этой ошибки.
любая помощь приветствуется
Вот код
$.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
});
Спасибо
3 ответа
Я столкнулся с той же проблемой, и единственное решение, которое я нашел, это реализовать плагин 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 не решает проблему вопреки тому, что сказано в примечании к выпуску...
До свидания!
Sup, как дела с аутентификацией?
если вы используете XMLHttpRequest()
лайк: var request = new XMLHttpRequest();
попробуйте проверить, что происходит с чем-то вроде: console.log("status: " + request.status);
Если это работает, вы можете использовать:
if (request.status == 401) {
// blabla
return;
}
У меня была эта проблема в последние пару месяцев, и, наконец, я понял это.
Прежде всего, временный обходной путь, который мы использовали, состоял в том, чтобы установить период ожидания для запроса. Это сработало, но ответ всегда был 404. Мы не знали, действительно ли он не прошел аутентификацию или наши сервисы не работали. Не приемлемый обходной путь для нашей системы.
Наконец, после ОЧЕНЬ погугливания я обнаружил реальную проблему.
Когда возвращается 401 (это обычная проверка подлинности, ошибка проверки подлинности), он добавляет заголовок к ответу, который называется "WWW-Authenticate". Это говорит браузеру предложить пользователю попробовать войти в систему. IOS We bView не знает, что с этим делать, поэтому приложение зависает.
От вашего сервиса все, что вам нужно сделать, это удалить заголовок WWW-Authenticate, и вы должны начать видеть 401 в вашей функции ошибки.