. net HTTP-запрос клиента HTTP возвращает ошибку типа носителя, не поддерживаемого (код ошибки 415) - PullRequest
0 голосов
/ 03 мая 2020

Я пытаюсь получить содержимое модуля Runbook с помощью этой конечной точки API - https://docs.microsoft.com/en-us/rest/api/automation/runbook/getcontent

Мне удалось успешно получить данные с помощью почтальона. Тем не менее, я получаю сообщение об ошибке 415 (тип носителя содержимого 'text / powershell' не поддерживается. Поддерживается только 'application / json') от клиента C#.

Вот что я пробовал

public class AzureAutomationCustomClient
    {
        private readonly AppConfig _appConfig;
        private readonly HttpClient _httpClient;
        private ILogger<AzureAutomationCustomClient> _logger;
        private readonly IAuthProvider _tokenService;

        public AzureAutomationCustomClient(AppConfig appConfig, HttpClient httpClient, ILogger<AzureAutomationCustomClient> logger, IServiceProvider serviceProvider)
        {
            _appConfig = appConfig;
            _httpClient = httpClient;
            _httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("*/*"));// Didn't work
            _logger = logger;
            _tokenService = serviceProvider.GetServices<IAuthProvider>().First(x => x.GetType() == typeof(AdalAuthProvider));
        }
        public async Task GetRunbookContentAsync(string runbookName)
        {
            var url = $"https://management.azure.com/subscriptions/{_appConfig.AzureConfig.SubscriptionId}/resourceGroups/{_appConfig.AzureAutomationConfig.ResourceGroup}/providers/Microsoft.Automation/automationAccounts/{_appConfig.AzureAutomationConfig.AutomationAccountName}/runbooks/{runbookName}/content?api-version=2018-06-30";
            var request = new HttpRequestMessage(HttpMethod.Get, url);

            _logger.LogInformation($"Sending get request with URL {url}");

            request.Headers.Add("accept", "text/powershell");
            request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", await _tokenService.GetAccessTokenAsync());

            HttpResponseMessage response = await _httpClient.SendAsync(request);

            await _logger.LogHttpResponseAsync(response);

            if (!response.IsSuccessStatusCode)
            {
                _logger.LogError($"Error occurred while fetching runbook content for runbook {runbookName}");
                _logger.LogError($"Status code is {response.StatusCode}");
                _logger.LogError($"Reason phrase is {response.ReasonPhrase}");
            }
            response.EnsureSuccessStatusCode();
            string content = await response.Content.ReadAsStringAsync();

        }
    }

Я также пытался использовать Azure SDK и получаю ту же ошибку.

public async Task<Stream> GetRunbookContentAsync(string runbookName)
        {
            var headers = new Dictionary<string, List<string>>
            {
                { "accept", new List<string> { "text/powershell" } }
            };
            AzureOperationResponse<Stream> response = await AutomationClient.Runbook.GetContentWithHttpMessagesAsync(_resourceGroup, _automationAccountName, runbookName, headers);
            return response.Body;
        }

Обратите внимание, что это запрос GET, а не POST. Кроме того, он прекрасно работает в почтальоне.

...