Я создал RESTful webservice (WCF), где проверяю учетные данные при каждом запросе. Один из моих клиентов - это приложение для Android, и все хорошо на стороне сервера. Я получаю запрос, и если у него есть правильный заголовок - я обрабатываю его и т. Д.
Теперь я создал клиентское приложение, которое использует этот сервис. Вот как я делаю GET:
// Create the web request
var request = WebRequest.Create(Context.ServiceURL + uri) as HttpWebRequest;
if (request != null)
{
request.ContentType = "application/json";
// Add authentication to request
request.Credentials = new NetworkCredential(Context.UserName, Context.Password);
// Get response
using (var response = request.GetResponse() as HttpWebResponse)
{
// Get the response stream
if (response != null)
{
var reader = new StreamReader(response.GetResponseStream());
// Console application output
var s = reader.ReadToEnd();
var serializer = new JavaScriptSerializer();
var returnValue = (T)serializer.Deserialize(s, typeof(T));
return returnValue;
}
}
}
Итак, этот код получает мой ресурс и десериализует его. Как вы видите - я передаю полномочия в моем звонке.
Затем при отладке на стороне сервера я заметил, что каждый раз я получаю 2 запроса - один без заголовка аутентификации, а затем сервер отправляет ответный ответ, а второй запрос отправляется с учетными данными. Я думаю, что это плохо для моего сервера - я бы предпочел не совершать никаких обходов. Как мне сменить клиента, чтобы этого не произошло? Смотрите скриншот Fiddler
EDIT
Это код JAVA, который я использую с Android - он не выполняет двойной вызов:
MyHttpResponse response = new MyHttpResponse();
HttpClient client = mMyApplication.getHttpClient();
try
{
HttpGet request = new HttpGet(serviceURL + url);
request.setHeader(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
request.addHeader("Authorization", "Basic " + Preferences.getAuthorizationTicket(mContext));
ResponseHandler<String> handler = new BasicResponseHandler();
response.Body = client.execute(request, handler);
response.Code = HttpURLConnection.HTTP_OK;
response.Message = "OK";
}
catch (HttpResponseException e)
{
response.Code = e.getStatusCode();
response.Message = e.getMessage();
LogData.InsertError(mContext, e);
}