Я разрабатываю приложение для Android и веб-службу, которые общаются. Моя веб-служба находится в WEB API 2 с аутентификацией на предъявителя маркера.Ошибка 401 на WEB API 2, когда есть много запросов с устройства Android
Моя проблема заключается в том, что, когда я отправить слишком много запросов (~ 20 запроса в течение 15 секунд) на мой веб-службы из моего Android App, ответ WS с
“401” : “Authorization has been denied for this request”
Это произойдет только на сервере (Amen hoster) И с устройства Android. Например, если я попытаюсь с Postman, все будет хорошо. Так что это связано с моим производственным сервером и/или моим запросом на приложение для Android.
Код для доступа к веб-службе
URL obj = new URL(SERVEUR_URL + url);
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
con.setRequestProperty("Authorization", "Bearer " + token);
con.setRequestProperty("Content-Type", "application/json");
int responseCode = con.getResponseCode();
String responseMessage = con.getResponseMessage();
Поставщик проверки подлинности на моем веб-службы по умолчанию один. Без изменений.
Запрос от моего Android App (не работает каждый раз)
GET http://api.xxxx.com/api/Weesps/GetAvailableWeesps HTTP/1.1
Authorization: Bearer XXXX
Content-Type: application/json
User-Agent: Dalvik/2.1.0 (Linux; U; Android 6.0; Google Nexus 5X - 6.0.0 - API 23 - 1080x1920 Build/MRA58K)
Host: api.xxxx.com
Connection: Keep-Alive
Accept-Encoding: gzip
Запрос от Почтальон (работа каждый раз)
GET http://api.xxxx.com/api/Weesps/GetAvailableWeesps HTTP/1.1
Host: api.xxxx.com
Connection: keep-alive
Authorization: Bearer XXXX
Cache-Control: no-cache
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36
Postman-Token: bca55154-775d-9709-7a8b-4793393890ad
Accept: */*
Accept-Encoding: gzip, deflate, sdch
Accept-Language: fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4
Cookie: dadaproaffinity=14ff51cc869a14d3552485cb4ceee1faa1be7165cc5d4b0e2b19370f11afcbea
То, что я пробовал:
- Воспроизвести эту ошибку в местных: она отлично работает на локальном сервере (веб и SQL серверов) из Android App или от Почтальон
- проверить, что маркер был правильно отправлен в каждом запросов
- Запрос от Android то же самое каждый раз, когда
- Попробовал добавить отсутствующий заголовок в мой запрос на приложение для Android.
Я потратил два дня на эту проблему и прочитал много сообщений о stackoverflow, но никто мне не помогает. Спасибо за помощь.
UPDATE 1:
С Скрипач я увидел, что в запросе GET от Postman, они были заголовок Cookie. Этот файл cookie отправляется, когда мы запрашиваем токен-носитель.
Пример маркеров ответа от сервера
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-Length: 691
Content-Type: application/json;charset=UTF-8
Expires: -1
Server: Microsoft-IIS/8.5
Set-Cookie: .AspNet.Cookies=XXXX; path=/; HttpOnly
X-Powered-By: ASP.NET
X-Powered-By: ARR/2.5
Date: Tue, 31 May 2016 16:55:39 GMT
{"access_token":"XXXX","token_type":"bearer","expires_in":1209599,"userName":"Foo",".issued":"Tue, 31 May 2016 16:55:40 GMT",".expires":"Tue, 14 Jun 2016 16:55:40 GMT"}
Скрипач и Почтальон сохранили это печенье, и они автоматически поместить его в запросах к API (например, на «Запрос от Почтальон» блок кода). Когда я удаляю cookie из запроса Postman GET, он не работает (как и мое приложение для Android).
Теперь возникает вопрос: почему WEB API 2 отправляет cookie вместо использования токена? И почему маркер отлично работает в первых запросах и не работает должным образом для следующих запросов?
Одно из отличий между двумя запросами - это заголовок Cache-Control. Вы пробовали настроить это на свои Android-запросы? – elevine
Привет, подъем, спасибо за чтение. Да, я пытался с или без Cache-Control, и нет никакой разницы. – JohnB