Dynamics 365 Online: вызов API REST с переменной «% 2F» в URL - PullRequest
0 голосов
/ 24 апреля 2018

ОК, так что это слишком долго занимало меня. Тестируя вызов api с помощью SOAPUI или Restlett в Chrome, я могу получить ожидаемый результат - двоичный файл, представляющий pdf или, возможно, html. Я выделил часть рассматриваемого URL-адреса желтым цветом (это действительно номер документа, который должен быть загружен, и в родительской системе это " 130318 / HJRWIQ ", но мы не можем использовать '/' в URL-адрес, таким образом, 130318% 2FHJRWIQ представляет его в вызове web-api.

Результаты испытаний Chrome Restlett Api: Chrome - RestLet Api test

Теперь, пытаясь сделать то же самое в c #, этот URL возвращает '

404 не найдено

и я подозреваю, что% 2F снова как-то кодируется обратно в '/'. Ниже приведены два разных метода, которые я попробовал (оба делают одно и то же):

c # методы для загрузки того же ответа;

internal static string DownloadData(string resourceUrl, string authorizationApi, StringBuilder sb)
    {
        using (var wc = new WebClient())
        {
            // copy data to byte[]
            wc.Headers.Add("Content-Type", "application/pdf");
            wc.Headers.Add("Authorization", authorizationApi);
            wc.Headers.Add("OData-MaxVersion", "4.0");
            wc.Headers.Add("OData-Version", "4.0");
            var data = wc.DownloadData(new Uri(@resourceUrl));
            sb.AppendLine(" url used\t" + wc.BaseAddress);
            sb.AppendLine(" querystring value\t" + wc.Encoding);
            return Convert.ToBase64String(data);
        }
    }

    internal static string DownloadData(string resourceUrl, string authorizationApi, ITracingService trace)
    {
        try
        {
            using (var wc = new WebClient())
            {
                wc.Headers.Add("ContentType", " text/plain");
                wc.Headers.Add("Authorization", authorizationApi);
                //wc.Headers.Add("Content-Disposition", "attachment; filename='82400200813_-doc.pdf'");
                //wc.Headers.Add("Transfer-Encoding", "chunked");
                return wc.DownloadString(new Uri(@resourceUrl));
            }
        }
        catch (Exception e)
        {
            trace.Trace("DOWNLOAD DATA EXCEPTION: \n" + e.Message + "\n" + e.InnerException);
        }

        return "";
    }

Исключение, зарегистрированное в соответствии с приведенным выше:

ЗАГРУЗИТЬ ДАННЫЕ, ИСКЛЮЧЕНИЕ: Удаленный сервер возвратил ошибку: (404) Not Found.

просто игнорируйте построитель строк и трассировку (это используется для удаленной отладки), так как он работает в режиме онлайн.

Кто-нибудь еще сталкивался с этим раньше? Как мне правильно передать url?

EDIT Даже MS воспроизвела это и не имеет обходного решения - я переместил этот код в службу Azure, которая могла бы самостоятельно получать данные и передавать результат обратно;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...