2009-05-25 1 views
2

Мне нужно указать, указывает ли ссылка (URL) на XML-файл (RSS-канал) или обычный HTML-файл, просто просматривая заголовки или что-то подобное (без его загрузки)C# HttpWebRequest - Как обрезать между HTML и XML-страницами без загрузки?

Любой Хороший совет для меня там? :)

Спасибо! Roey

ответ

11

Вы можете просто сделать запрос HEAD, вместо полного POST/GET

Это поможет вам заголовки для этой страницы, которая должна включать в себя тип содержимого. Из того, что вы должны быть в состоянии различить, если его текст/HTML или XML

Theres хороший пример here on SO

+3

+1 идеальный ответ и точная причина существования запроса HEAD –

+2

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

+0

Я считаю, что один «может» и два «должен». ;] – bzlm

-3

просто прочитал его в «текстовом» читателе. , тогда решите, что лучше всего, например, искать некоторые теги, приходит на ум;) , а затем вытащите его в своем реальном читателе.

или это слишком просто?

+0

Он специально сказал, что хотел знать, прежде чем загружать весь файл. –

2

Вы можете использовать заголовок Content-Type, а для экономии полосы пропускания вы можете заставить веб-сервер обслуживать определенную часть документа. Если в ответе сервер включает в себя заголовок , вы можете использовать Range: bytes=0-10 для загрузки только первых десяти байтов (или даже пытаться ничего не загружать).

Также исследование HEAD глагол вместо GET.

+0

+1 Я собирался предложить тип контента ;-) – Shoban

0

Вы не можете узнать, какой тип файла он просто ищет URL.

Я предлагаю вам попробовать проверить MIME-тип документа, который вы запрашиваете, или прочитать первую строку и надеяться, что автор поставил Doctype.

5

Вслед за ответ Эоин Кэмпбелл, вот фрагмент кода, который должен делать то, что с помощью System.Net функциональность:

using (var request = System.Net.HttpWebRequest.Create(
    "http://tempuri.org/pathToFile")) 
{ 
    request.Method = "HEAD"; 

    using (var response = request.GetResponse()) 
    { 
     switch (response.ContentType) 
     { 
      case "text/xml": 
       // ... 
       break; 
      case "text/html": 
       // ... 
       break; 
     } 
    } 
} 

Конечно, предполагается, что веб-сервер публикует тип контента (MIME) и делает это правильно. Но поскольку вы заявили, что хотите использовать эффективный пропускной способ, я полагаю, вы не хотите загружать все разметки и анализировать это! Если честно, тип контента обычно устанавливается правильно в любом случае.

+0

Вы можете просто использовать response.ContentType; –

+0

@ Матвей: Хорошее наблюдение. Сообщение отредактировано. – Noldorin

+1

Это отвечает на половину вопроса. Есть несколько сложных типов контента, например: http://www.w3.org/TR/xhtml-media-types/#application-xhtml-xml – bzlm

1

Проверьте заголовки в объекте HttpWebResponse. Заголовок Content-Type должен читать текст/xml для документа XML/RSS и text/html для стандартной веб-страницы.

0

Вообще-то это невозможно. Это связано с тем, что возможно (хотя и бесполезно) служить либо HTML, либо XML-файлами в качестве приложения/октетного потока. Кроме того, как отмечают другие, существует несколько допустимых типов mime XML. Тем не менее, запрос ГОЛОВА затем проверить тип содержимого может работать иногда:

WebRequest req = WebRequest.Create(url); 
WebResponse resp = req.GetResponse(); 
req.Method = "HEAD"; 
String contentType = resp.ContentType; 

if(contentType == "text/xml") 
    getXML(url); 
else if(contentType == "text/html") 
    getHTML(url); 

Но если вы собираетесь обрабатывать его как-то так или иначе, вы можете сделать:

WebRequest req = WebRequest.Create(url); 
WebResponse resp = req.GetResponse(); 
String contentType = resp.ContentType; 

if(contentType == "text/xml") 
    processXML(resp.GetResponseStream()); 
else if(contentType == "text/html") 
    processHTML(resp.GetResponseStream()); 
else 
    // process error condition 

Имейте в виду, файлы загружаемый по мере необходимости.Поэтому просто запрос объекта ответа не вызывает загрузку всего файла.

Смежные вопросы