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代理

要在 C# 中使用 RESTful Web 服务,我应该使用 HttpWebRequest 吗?

c# httpwebrequest 模拟登陆