C# HttpWebRequest - 如何在不下载的情况下区分 HTML 和 XML 页面?
Posted
技术标签:
【中文标题】C# HttpWebRequest - 如何在不下载的情况下区分 HTML 和 XML 页面?【英文标题】:C# HttpWebRequest - How to disgtinguish between HTML and XML pages without downloading? 【发布时间】:2010-10-28 17:06:04 【问题描述】:我需要能够通过查看标题或类似的东西(无需下载)来判断链接(URL)是指向 XML 文件(RSS 提要)还是常规 html 文件
对我有什么好的建议吗? :)
谢谢! 罗伊
【问题讨论】:
【参考方案1】:只需在“文本”阅读器中阅读即可。 然后通过例如寻找一些标签来决定哪个是最好的;) 然后将其放入您的实际阅读器中。
还是太简单了?
【讨论】:
他特别说他想在下载整个文件之前知道。【参考方案2】:您可以使用Content-Type
标头,为了节省带宽,您可以强制网络服务器为您提供文档的指定部分。如果服务器在其响应中包含Accept-Ranges: bytes
标头,您可以使用Range: bytes=0-10
仅下载前十个字节(甚至尝试不下载任何内容)。
还要研究HEAD
动词而不是GET
。
【讨论】:
【参考方案3】:您无法仅通过查看 URL 来找出它是什么文件类型。
我建议您尝试检查您请求的文档的 MIME-type,或者阅读第一行并希望作者输入了 Doctype。
【讨论】:
【参考方案4】:你可以只做一个 HEAD 请求而不是一个完整的 POST/GET
这将为您提供该页面的标题,其中应包含内容类型。 从中您应该能够区分它的 text/html 还是 xml
有一个很好的例子here on SO
【讨论】:
+1 完美答案和 HEAD 请求存在的确切原因 稍微提醒一下,有些服务器不支持 HEAD,所以当它失败时不要忘记回退到 GET/POST。 我数了一个“可以”和两个“应该”。 ;] 确实......它确实假设有问题的网络服务器支持 HTTP HEAD 请求并且内容 mimetypes 设置正确(如果有的话),但我认为这些场景将是例外的规则。【参考方案5】:跟进 Eoin Campbell 的回复,这里有一个代码 sn-p,它应该使用 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;
当然,这假设 Web 服务器发布内容 (MIME) 类型并且这样做是正确的。但是,既然您说想要一种带宽有效的方式来执行此操作,我假设您不想下载所有标记并对其进行分析!老实说,内容类型通常在任何情况下都设置正确。
【讨论】:
你可以只使用 response.ContentType; 这正好回答了一半的问题。有一些棘手的内容类型,例如:w3.org/TR/xhtml-media-types/#application-xhtml-xml @bzlm:是的,但他们真的习惯了吗?我们在这里只讨论 HTML 和 XML 类型。【参考方案6】:检查 HttpWebResponse 对象中的标头。对于 XML/RSS 文档,Content-Type 标头应该读取 text/xml,对于标准网页,应该读取 text/html。
【讨论】:
【参考方案7】:一般来说,这是不可能的。这是因为可以(尽管没有帮助)将 HTML 或 XML 文件作为 application/octet-stream 提供。此外,正如其他人所指出的,有多种有效的 XML mime 类型。但是,HEAD 请求然后内容类型检查有时会起作用:
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
请记住,文件是根据需要下载的。所以仅仅请求响应对象并不会导致整个文件被下载。
【讨论】:
以上是关于C# HttpWebRequest - 如何在不下载的情况下区分 HTML 和 XML 页面?的主要内容,如果未能解决你的问题,请参考以下文章
C# HttpWebRequest - 如何在不下载的情况下区分 HTML 和 XML 页面?
如何使用 c# 使用 httpwebrequest 从 json api 获取数据?
用c#编写webservice时,如何获取调用它的httpwebrequest中?后面的参数 非常感谢。
C# HttpWebRequest 如何实现SOCKET5代理