В настоящее время я изменяю свое клиентское приложение, чтобы использовать 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;
});
}
}
Добавление сетевого вывода из браузера
Снимок экрана с вкладкой "Сеть"