1

Я просто работаю над своим первым приложением Windows Phone 8.1 (Universal, если это имеет значение, но только Windows Phone реализована в данный момент). И сначала все работает очень гладко, но как только мое приложение работает около 25-30 минут, я больше не могу использовать свой HttpClient. Я использую Windows.Web.Http.HttpClient.Digest Authentication Token Недействительный через некоторое время

С моей помощью s I used a single HttpClient and reused it all the time. As I became aware that this is not working I started using a new HttpClient` для каждого запроса. Но до сих пор не повезло.

Это мой метод, чтобы получить новый HttpClient:

private HttpClient GetClient() 
    { 
     var filter = new HttpBaseProtocolFilter 
     { 
      AllowUI = false, 
      CacheControl = { WriteBehavior = HttpCacheWriteBehavior.NoCache }, 
      ServerCredential = 
       new PasswordCredential(
       BaseApiUri.ToString(), 
       credentials.UserName, 
       credentials.Password), 
     }; 

     var httpClient = new HttpClient(filter); 
     var headers = httpClient.DefaultRequestHeaders; 
     var httpConnectionOptionHeaderValueCollection = headers.Connection; 
     httpConnectionOptionHeaderValueCollection.Clear(); 
     headers.Accept.TryParseAdd("application/json"); 
     headers.CacheControl.TryParseAdd("no-cache"); 
     headers.Add("Pragma", "no-cache"); 
     headers.Add("Keep-Alive", "false"); 
     headers.Cookie.Clear(); 

     return httpClient; 
    } 

Дополнительные настройки заголовков и очистки куки мои попытки остановить своего рода кэширование соединений под поверхностью, что может произойти код. Но до сих пор не повезло.

Мой способ сделать запросы мой API, как следующее:

private async Task<bool> PostNoResponseRequestTo(string relativeUri, object requestContent, CancellationToken cancellationToken) 
    { 
     var targetUri = new Uri(BaseApiUri, relativeUri); 
     var requestJson = JsonConvert.SerializeObject(requestContent); 
     var content = new HttpStringContent(requestJson, UnicodeEncoding.Utf8, "application/json"); 
     try 
     { 
      using (var httpClient = this.GetClient()) 
      { 
       var post = 
        await httpClient.PostAsync(targetUri, content).AsTask(cancellationToken).ContinueWith(
         async request => 
          { 
           using (var response = await request) 
           { 
            return response.IsSuccessStatusCode; 
           } 
          }, 
         cancellationToken); 

       return await post; 
      } 
     } 
     catch (Exception) 
     { 
      return false; 
     } 
    } 

Это прекрасно работает в течение примерно 25-30 минут, после чего вызовы API вдруг начинают на провал. Я начинаю получать 401, но, как вы можете видеть, я указал учетные данные, и потому что они работают и не меняются (жестко запрограммированные для проверки этого). Я начинаю полагать, что проблема связана со стороной API.

Это ответ я получаю:

StatusCode: 401, ReasonPhrase: 'Unauthorized', Version: 2, Content:  Windows.Web.Http.HttpStreamContent, Headers: 
{ 
    Server: Microsoft-IIS/8.5 
    Date: Fri, 20 Mar 2015 14:25:06 GMT 
    WWW-Authenticate: Digest qop="auth",algorithm=MD5-sess,nonce="+Upgraded+NounceRemoved",charset=utf-8,realm="Digest", Negotiate, NTLM 
    X-Powered-By: ASP.NET 
} 
{ 
    Content-Length: 1344 
    Content-Type: text/html 
} 

Мой API состоит из проекта Asp.Net с ServiceStack для его функциональности API. Это работает на IIS с активированной аутентификацией дайджеста (все остальные отключены).

Просмотрев журналы, я узнал об отказе API-вызовов перед каждым успешным вызовом. Но если я прав, это по дизайну digest auth, потому что я не нашел способ сказать клиенту, что другая сторона использует дайджест auth. Я смог указать эту информацию в других проектах .Net, но по какой-то причине Microsoft изменила код (и пространство имен) на HttpClient. Я также знаю HttpClient в исходном пространстве имен, которое вы можете получить через nuget, но это не работает для меня, так как я получаю сообщение об ошибке в моем окне вывода, как только я вызываю вызов. Это закрывает мое приложение без какой-либо информации.

Назад к журналу Я смог получить некоторую информацию с помощью расширенного ведения журнала и инструмента для их анализа. Ошибка - это что-то вроде (не могу получить доступ к ней прямо сейчас, отредактирует ее позже): «Недопустимый токен, переданный функции/методу».

Я действительно надеюсь, что кто-то может помочь мне решить эту проблему, так как приложение практически не работает. Мои пользователи должны перезапустить приложение каждые 15 минут, чтобы быть на сайте сохранения.

Спасибо за все советы, которые мне помогают.

+0

Удалось ли вам решить эту проблему? У меня такая же проблема прямо сейчас (в UWP). Через ровно 10 минут я получаю только 401 в качестве ответа ... – Dust258

+0

@ Dust258 Нет, извините, мы используем работу arround. Мы просто пытаемся выполнить аутентификацию несколько раз, и это работает для нас. – FrTerstappen

ответ

3

Попробуйте проверить настройку ключа машины в IIS. Автоматически генерировать во время выполнения, если тик будет генерировать новый ключ каждый раз, когда пул приложений перезапускается. Это может вызвать проблемы. Ключ машины можно установить на уровне сервера, веб-сайта или приложения. Поскольку активированная аутентификация дайджеста зашифровывается, это может быть проблемой.

Managing Websites with IIS Manager (part 6) - The Machine Key and Windows Authentication

+0

Никогда не знал об этой настройке и просто попробовал. Это не помогает, но я чувствую, что он увеличил время примерно на 5 минут. Но это может быть только я. Также отредактировал мой вопрос с дополнительной информацией. – FrTerstappen

Смежные вопросы