Получение случайных таймаутов при подключении к серверу
Я случайно получаю исключение тайм-аута при отправке запроса на сервер. Я пробовал httpwe brequest, restsharp и httpclient. Я не могу использовать HttpClient
потому что мне нужно добавить пользовательские сертификаты, а они не реализованы.
Это то, что я узнал до сих пор:
-запросы работают нормально в консольном приложении
-запросы работают нормально в http URL
-запросы не работают на https с сертификатом клиента (.pfx) с X-CSRF-Token и X-FORMS_BASED_AUTH_ACCEPTED (кажется, работает нормально с NTLM)
-запросы, кажется, работают нормально при использовании только NTLM-аутентификации при каждом вызове (не куки)
Инициализируйте RestClient:
Setup.RestClient = new RestClient(App.EnvironmentServerUrl);
Setup.RestClient.ClientCertificates = new X509CertificateCollection() { Setup.Certificate };
Setup.RestClient.CookieContainer = new CookieContainer();
if (!String.IsNullOrEmpty(App.Cookie.Value))
Setup.RestClient.CookieContainer.Add(new Uri(App.EnvironmentServerUrl), App.Cookie);
Setup.RestClient.AddHandler("application/json", NewtonsoftJsonSerializer.Default);
Setup.RestClient.AddHandler("text/json", NewtonsoftJsonSerializer.Default);
Setup.RestClient.AddHandler("text/x-json", NewtonsoftJsonSerializer.Default);
Setup.RestClient.AddHandler("text/javascript", NewtonsoftJsonSerializer.Default);
Setup.RestClient.AddHandler("*+json", NewtonsoftJsonSerializer.Default);
Звонить:
var request = new RestRequest(url, Method.POST);
request.OnBeforeDeserialization = resp =>
{
string byteOrderMarkUtf8 = Encoding.UTF8.GetString(Encoding.UTF8.GetPreamble());
if (resp.Content != null && resp.Content.Length > 0 && resp.Content.StartsWith(byteOrderMarkUtf8))
resp.Content = resp.Content.Remove(0, byteOrderMarkUtf8.Length);
};
request.AddHeader("Accept", "application/json");
request.Parameters.Clear();
request.AddParameter("application/json", this.SerializeToJson(parameters), ParameterType.RequestBody);
request.JsonSerializer = NewtonsoftJsonSerializer.Default;
request.AddHeader("X-CSRF-Token", "Fetch");
request.AddHeader("X-FORMS_BASED_AUTH_ACCEPTED", "f");
if (App.Cookie == null || String.IsNullOrEmpty(App.Cookie.Value))
{
CredentialCache credentials = new CredentialCache();
credentials.Add(new Uri(App.EnvironmentServerUrl), "NTLM", new NetworkCredential(App.Credentials.UserName, App.Credentials.Password));
request.Credentials = credentials;
}
return await this.ExecuteAsync<T>(request);
public Task<T> ExecuteAsync<T>(RestRequest request) where T : new()
{
var taskCompletionSource = new TaskCompletionSource<T>();
Setup.RestClient.ExecuteAsync<T>(request, (response) => {
if (App.Cookie == null || String.IsNullOrEmpty(App.Cookie.Value))
{
App.Cookie = Setup.RestClient.CookieContainer.GetCookies(Setup.RestClient.BaseUrl)["FedAuth"];
}
if (!this.IsSuccessStatusCode(response.StatusCode))
{
taskCompletionSource.SetException(response.ErrorException);
}
else
{
taskCompletionSource.SetResult(response.Data);
}
});
return taskCompletionSource.Task;
Примечание. Мне удалось реализовать собственный AndroidClientHandler для использования клиентских сертификатов, но я получаю ошибку аутентификации NTLM.