링크 (URL)가 XML 파일 (RSS 피드) 또는 일반 HTML 파일을 가리키는 지 (머리글 또는 다운로드하지 않고) 비슷하게 알 수 있어야합니다.C# HttpWebRequest - 다운로드하지 않고 HTML 페이지와 XML 페이지를 구분하지 않으려면 어떻게해야합니까?
모두 저를위한 좋은 조언이 있습니까? :)
고마워요! Roey
링크 (URL)가 XML 파일 (RSS 피드) 또는 일반 HTML 파일을 가리키는 지 (머리글 또는 다운로드하지 않고) 비슷하게 알 수 있어야합니다.C# HttpWebRequest - 다운로드하지 않고 HTML 페이지와 XML 페이지를 구분하지 않으려면 어떻게해야합니까?
모두 저를위한 좋은 조언이 있습니까? :)
고마워요! Roey
당신은 단지 대신 전체 POST의 HEAD 요청을 할 수있는/당신에게 콘텐츠 형식을 포함해야 해당 페이지의 헤더를 얻을 것이다
를 가져옵니다. 당신은 그것의 텍스트/HTML이나 XML은 에오 인 캠벨의 응답에 최대에 따라 좋은 예 here on SO
그냥 "텍스트"리더에서 읽습니다. 다음 중 어떤 것이 가장 적합한 지 결정하십시오. 예를 들어, 일부 태그를 찾으려면 마음에 듭니다.) 그런 다음 실제 리더에서 제거하십시오.
또는 너무 간단합니까?
그는 특히 전체 파일을 다운로드하기 전에 알고 싶다고 말했습니다. –
Content-Type
헤더를 사용할 수 있으며 대역폭을 절약하기 위해 웹 서버가 문서의 지정된 부분을 사용자에게 제공하도록 할 수 있습니다. 서버에 응답에 Accept-Ranges: bytes
헤더가 포함되어있는 경우 Range: bytes=0-10
을 사용하여 처음 10 바이트 만 다운로드 할 수 있습니다 (또는 아무것도 다운로드하지 않으려 고 할 수도 있음).
또한 GET
대신 HEAD
동사를 연구하십시오.
+1 콘텐츠 형식을 제안하려고 시도했습니다. – Shoban
URL을 보면 파일 유형을 알 수 없습니다.
요청한 문서의 MIME 유형을 확인하거나 첫 번째 줄을 읽고 작성자가 Doctype을 입력했으면 좋겠다.
Theres는 경우를 구별 할 수 있어야에서, 여기에 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) 유형을 게시하고 올바르게 작동한다고 가정합니다. 그러나 대역폭을 효율적으로 사용하는 방법을 원한다고 말한 이후로 모든 마크 업을 다운로드하고 분석하는 것을 원하지 않는다고 가정합니다. 솔직히 콘텐츠 유형은 대개 어떤 경우에도 올바르게 설정됩니다.
HttpWebResponse 개체의 헤더를 확인하십시오. Content-Type 헤더는 XML/RSS 문서의 경우 text/xml을, 표준 웹 페이지의 경우 text/html을 읽어야합니다.
일반적으로 말해서, 이것은 불가능합니다. HTML/XML 파일을 application/octet-stream으로 제공하는 것이 가능하기는하지만 (도움이되지는 않지만) 가능하기 때문입니다. 또한 다른 사람들이 언급했듯이 여러 가지 유효한 XML MIME 유형이 있습니다.
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);
을하지만 당신은 어떻게 든 어느 쪽이든 그것을 처리하는 거라면, 당신은 할 수 있습니다 : : 그러나, HEAD 요청은 콘텐츠 형식 검사는 때때로 일할 수
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
파일은 명심하십시오 필요에 따라 다운로드 할 수 있습니다.따라서 응답 객체를 요청한다고해서 전체 파일이 다운로드되는 것은 아닙니다.
+1 응답 및 HEAD 요청의 정확한 이유가 있습니다. –
일부 서버는 HEAD를 지원하지 않으므로 다시 잊지 마십시오. 실패하면 GET/POST하십시오. –
나는 하나를 "수", 2는 "해야한다". ;] – bzlm