Получение имени файла из виртуального URL?

#asp.net #url-rewriting #httpwebrequest #url-routing #httpresponse

#asp.net #url-переписывание #httpwebrequest #url-маршрутизация #httpresponse

Вопрос:

У меня есть URL-адрес типа «http://www.ti.com/lit/gpn/TPS767D318-Q1 » к которому в конечном итоге направляется путь «http://www.ti.com/lit/ds/symlink/tps767d318-q1.pdf » в браузере (рендеринг PDF-файла). Я обрабатываю этот URL-адрес в консольном приложении, чтобы получить имя файла «pdf», которое вы видите во втором URL-адресе, который я предоставил.

Я проверил UriResponse.Свойство Absoluteuri в объекте httpresponse и в нем говорится: «http://focus.ti.com/general/docs/lit/getliterature.tsp?genericPartNumber=TPS767D318-Q1amp;fileType=pdf » похоже, это вложенный виртуальный путь. Кто-нибудь может помочь мне перейти к конечному URL-адресу, чтобы извлечь имя файла PDF? я не нашел его нигде в объекте ответа. Я также проверил заголовки ответов, и там тоже ничего нет.

Любая помощь будет оценена…Спасибо

Ответ №1:

Не уверен насчет ASP, но на уровне протокола начальный запрос может вызвать перенаправление, выдаваемое приложением / сервером на другом конце, поэтому вы можете просмотреть первоначальный HTTP-ответ и проверить, является ли это кодом перенаправления, 301, 302 и т.д. Если это так, вы можете следовать 302s, пока не нажмете 200, и это последний URL, который вы можете использовать для проверки имени файла.

Ответ №2:

Посмотрите на Content-Disposition заголовок, он может выглядеть примерно так: Content-Disposition: attachment; filename=tps767d318-q1.pdf . Это распространенный метод для веб-сервисов, которые извлекают и «загружают» файлы из базы данных, общих сетевых ресурсов и т. Д.

Комментарии:

1. Да, я проверил это… В нем нет имени файла. В ответе отсутствует заголовок «Content-Disposition». странно… тип содержимого отображается как «html» вместо «application / PDF». Интересно, перенаправляет ли он вообще на файл PDF !!? Есть идеи, что происходит?

2. Я бы отслеживал запрос / ответ с помощью чего-то вроде Firebug или Fiddler; как упоминал PlexQ, возможно, вы сталкиваетесь с парами запросов / ответов сервера, поскольку они перенаправляют вас через отдельные «места».

Ответ №3:

Оказывается, URL-адрес в моем вопросе фактически возвращает содержимое HTML и перенаправляет «мета-тег». Итак, мне пришлось сделать следующее:

 var redirect = Regex.Match(new string(buffer, 0, count), @"<meta(?=[^>]*http-equivW*refresh)[^>]*?contents*=[^=>]*urls*=s*(?<Url>[^'"">] )", RegexOptions.IgnoreCase | RegexOptions.Singleline);

if (redirect.Success)
{
    Uri uri = new Uri(new Uri(externalUrl, UriKind.Absolute), new Uri(redirect.Groups["Url"].Value, UriKind.RelativeOrAbsolute));
    return SaveUrlToTemporaryFile(uri.AbsoluteUri, needsFullDownload);
 }
  

Я получаю окончательный URL-адрес из мета-тегов из возвращаемого содержимого HTML и снова вызываю процедуру загрузки.