Получение случайных таймаутов при подключении к серверу

Я случайно получаю исключение тайм-аута при отправке запроса на сервер. Я пробовал 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.

0 ответов