MessageHandler не выполняется правильно, когда конечная точка API вызывается из библиотеки Axios.js - PullRequest
0 голосов
/ 18 июня 2019

В настоящее время я изменяю свое клиентское приложение, чтобы использовать Axios.js вместо HTTP-запросов Fetch.js. Мне показалось, что в моих обработчиках сообщений WebAPI теперь происходит странное поведение.

У меня есть пользовательский APIKeyHandler, который наследует DelegatingHandler.
Я настроил APIKeyHandler при запуске приложения, так как я хочу, чтобы все мои запросы к API проходили через этот APIKeyHandler.

Когда я выполняю вызов к моей конечной точке API с помощью библиотеки Axios, запросы поступают в APIKeyHandler, однако, когда он достигает строки для вызова base.SendAsync, он не ожидает ответа и немедленно выполняет следующую строку. Я не испытываю такого поведения, когда я выполняю вызов API с использованием Fetch, VS Code Rest Client, Postman. Я сравнил HttpRequestMessage, поступающий в обработчик, и он идентичен для разных вызывающих.

Я не уверен, есть ли параметр конфигурации при выполнении запроса Axios или я что-то не так сделал в своем обработчике сообщений.

public class APIKeyHandler : DelegatingHandler
  {
      protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
      {
          bool isValidAPIKey = false;
          IEnumerable<string> lsHeaders;

          var checkApiKeyExists = request.Headers.TryGetValues("client_api_key", out lsHeaders);
          if (checkApiKeyExists)
          { //check here the database for the correct combination
              ApiKey clsApiKey = new ApiKey();
              ApiKeyModel aModel;
              aModel = clsApiKey.GetByApiKeyValue(lsHeaders.FirstOrDefault());
              if (aModel.Id > 0)
              {
                  isValidAPIKey = true;
              }
              else
              {
                  isValidAPIKey = false;
              }

          }

          //If the key is not valid, return an http status code.
          if (!isValidAPIKey)
              return request.CreateResponse(HttpStatusCode.NotFound);

          //Allow the request to process further down the pipeline

          var response = await base.SendAsync(request, cancellationToken);

          //Return the response back up the chain
          return response;
      }

  }

Клиентская сторона, использующая Axios

function AxiosTest(axiosparams) {

    return axios({
        method: 'get',
        url: axiosparams.URL,
        headers: {
            'Content-Type': 'application/json; charset=utf-8',
            'Accept': 'application/json',
            'client_api_key': clientApiKey
        },
        crossDomain: true, 
        responseType: 'json' 
    }).then(function (response) {
        return response;
    }).catch(function (error) {
        return error;
    });
}

Клиентская сторона, использующая Fetch

function FetchData(fetchparams) {

    var options = new Object();
    var myHeader = new Headers();
    myHeader.append('Content-Type', 'application/json; charset=utf-8');
    myHeader.append('Accept', 'application/json');
    myHeader.append('client_api_key', clientApiKey);
    options.method = 'get';
    options.headers = myHeader;

    return fetch(fetchparams.url, options)
        .then(JSONResponse)
        .then(function (data) {
           return data;
        })
        .catch(function (error) {
            return error;
        });
    }
}

Добавление сетевого вывода из браузера Снимок экрана с вкладкой "Сеть"

1 Ответ

0 голосов
/ 18 июня 2019

Добавьте data: {} в ваш запрос Axios.

В этом выпуске вы можете увидеть на GitHub, что Axios удаляет ваше Content-Type, если вы не указали свойство data.

Существует большое изменение, которое решит вашу проблему (я не знаю точно, какие другие фильтры / настройки у вас есть в вашем приложении).

...