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