Ошибка ключа подписки Azure APIM при одном вызове API большего набораC#

Место общения программистов C#
Ответить
Anonymous
 Ошибка ключа подписки Azure APIM при одном вызове API большего набора

Сообщение Anonymous »

У меня есть набор вызовов API, которые проходят через Azure APIM и достигают нашей серверной части. Все вызовы, кроме одного, работают должным образом, учитывая, что в комплект входит ключ подписки. Однако функция ниже, несмотря на то, что ключ подписки назначен в разделе заголовка, всегда приводит к ошибке 401: доступ запрещен, ключ подписки отсутствует. Чтобы пост был аккуратным, я буду исключать лишние типы, потому что они быстро загромождают пост, и я не думаю, что они являются причиной.

Код: Выделить всё

export const webApiConfig: WebApiConfig = {
endpointUrl: process.env.REACT_APP_WEBAPI_ENDPOINT as string,
subscriptionKey: process.env.REACT_APP_WEBAPI_GATEWAY_SUBSCRIPTION_KEY as string,
};

export const trainProjectAsync = async (projectName: string): Promise => {
try {
// Build the request url and config
const url: string = `${webApiConfig.endpointUrl}/Nlu/${projectName}/Train`;
const token = await getToken();
const requestConfig: AxiosRequestConfig = {
headers: {
Authorization: token,
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": webApiConfig.subscriptionKey,
},
signal: new AbortController().signal,
};

// Perform the POST request
const response = await axios.post(url, requestConfig);

return response.data satisfies NluTrainingState;
} catch (error) {
// check whether the error is an axios error or a stock error.
if (axios.isAxiosError(error)) {
throw new Error(`API call axios malfunction code: ${error.code} ${JSON.stringify(error.response)}`);
} else {
throw new Error(`API call stock malfunction, reason: ${error}`);
}
}
};
Это функция, которую он должен использовать через APIM (и тестирование ее через почтальон или в Swagger показывает, что эта функция работает так, как должна). Но если API размещен локально без промежуточного API-шлюза, вызов интерфейсного API также приведет к результату 401.

Код: Выделить всё

[Authorize]
[HttpPost("{projectName}/Train")]
[Produces("application/json")]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status401Unauthorized)]
[ProducesResponseType(StatusCodes.Status500InternalServerError)]
public async Task TrainAsync(string projectName)
{
try
{
// Launch a training job.
NluTrainingStateDto result = await _nluService.TrainAsync(projectName);

// Return the correct status based on whether the request was a success.
if (result != null)
{
return Ok(result);
}
else
{
return NotFound();
}
}
catch (ServiceAccessException serviceEx)
{
// TODO: add logging
IError error = _errorFactory.CreateError(ErrorCode.ControllerNotServiced, _exceptionResourceManager.GetString("ConnectionNotServicedExc")!);

ControllerNotServicedException _controllerEx = new(error, serviceEx);

return StatusCode((int)HttpStatusCode.InternalServerError, $"Internal Server Error: {_controllerEx.Message}");
}
}
Я пытался выполнить запрос четырьмя разными методами: POST, PATCH, PUT и GET. Все они терпят неудачу, за исключением GET, но я считаю, что использование GET для этого запроса нарушает соглашение, и я сохраняю это как последнее средство. Следует отметить, что эта конкретная функция раньше работала как запрос POST
EDIT: APIM создается с помощью спецификации OpenAPI через URL-адрес swagger.

Подробнее здесь: https://stackoverflow.com/questions/787 ... larger-set
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»