Простой WebClient работает локально, но не при развертывании в Azure - PullRequest
0 голосов
/ 22 февраля 2019

У меня очень простое тестовое приложение, которое создает WebClient и получает ответ от стороннего API (удаленная конфиденциальная информация):

using (WebClient client = new WebClient())
{
    var baseAddress = new Uri("https://test-url");

    client.Headers["Content-Type"] = "application/json";            

    var parms = Encoding.Default.GetBytes(
        "{ \"username\":\"<USERNAME>\"," +
           "\"password\":\<PASSWORD>\"," +
           "\"client_id\":\"<CLIENT_ID>\"," +
           "\"client_secret\":\"<CLIENT_SECRET>\"" +
        "}"
    );

    // Get access token
    var responseObject = new ResponseObject();
    var responseBytes = new byte[] { };
    string responseBody;           

    try
    {
        responseBytes = client.UploadData(baseAddress, "POST", parms);
        responseBody = Encoding.UTF8.GetString(responseBytes);
        responseObject = JsonConvert.DeserializeObject<ResponseObject>(responseBody);
    }
    catch (WebException ex)
    {
        var resp = (HttpWebResponse)ex.Response;
        Console.WriteLine(resp.StatusDescription);
    }
}

Этот код отлично работает, когда я запускаю его локально, несколькораз.Я получаю ответ обратно и могу извлечь из него необходимую информацию.

Однако после развертывания этого кода в Azure я пытаюсь вызвать API с помощью POSTMAN и получаю сообщение об ошибке.что есть «Ссылка на объект, не установленная для экземпляра объекта».ошибка в этой строке в try / catch:

var resp = (HttpWebResponse)ex.Response;

Indication of error-causing line

Итак, я подключил удаленный отладчик к API и прошел через этот маленький биткода.Что странно для меня, так это то, что я могу видеть прямо, когда программа переходит в часть кода catch, но нет объекта ex Exception.Под этим я подразумеваю, что в отладке я могу навести курсор на переменную ex, и ничего не появляется.Даже зависание над ex.Response ничего не показывает.Итак, поскольку там ничего нет (т.е. ex не существует, даже значение null), приложение бомбит с ошибкой нулевой ссылки.

Я думаю, что, возможно, что-то в Azureблокирует URL, так как я могу запустить это локально без проблем.Я спросил у наших сетевых ребят об этом, и они сказали, что не должно быть никаких ограничений, о которых они знают, чтобы предотвратить выход вызова.Странно то, что я включил ведение журнала диагностики в Azure для этого приложения, и ничего не отображается.Хотя я могу запустить приложение с помощью браузера или PostMan, в журнале ничего не отображается.Итак, это еще одна странная вещь.Я ожидаю, что смогу увидеть что-то .

В любом случае, я надеюсь, что, возможно, кто-то сталкивался с чем-то подобным и может указать мне на статью / решение / блогэто может пролить свет на это и привести меня к рабочему решению.

Спасибо!

РЕДАКТИРОВАТЬ: Добавлен снимок экрана с сообщением об ошибке, как оно отображается в браузере:

enter image description here

РЕДАКТИРОВАТЬ: добавлена ​​строка, в которой приложение выдает исключение ниже:

responseBytes = client.UploadData(baseAddress, "POST", parms);

Сразу после попытки выполнить эту строку, он переходит кcatch, но WebException, как представляется, отсутствует.

РЕДАКТИРОВАТЬ: Я нашел решение и добавил его в качестве ответа ниже.

1 Ответ

0 голосов
/ 22 февраля 2019

Я нашел решение, которое работало, и оно заняло одну строку кода:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

Так что, в основном, мне просто нужно было установить SecurityProtocol.Я не знаю, как это работало локально без него, но для его запуска в Azure, по-видимому, требуется его настройка.

...