Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#HttpWebRequest-如何在不下载的情况下区分HTML和XML页面?_C#_Html_Xml_Httpwebrequest_Xmlreader - Fatal编程技术网

C#HttpWebRequest-如何在不下载的情况下区分HTML和XML页面?

C#HttpWebRequest-如何在不下载的情况下区分HTML和XML页面?,c#,html,xml,httpwebrequest,xmlreader,C#,Html,Xml,Httpwebrequest,Xmlreader,我需要知道链接(URL)是指向XML文件(RSS提要),还是指向普通HTML文件,只需查看标题,或者类似的内容(无需下载) 有什么好的建议吗?:) 谢谢! Roey只要在“文本”阅读器中阅读即可。 然后决定哪一个是最好的,例如,在脑海中寻找一些标签;) 然后把它扔进你真正的阅读器里 还是太简单了?您可以使用内容类型标题,为了节省带宽,您可以强制web服务器为您提供文档的指定部分。如果服务器在其响应中包含Accept Ranges:bytes头,则可以使用Range:bytes=0-10仅下载前十

我需要知道链接(URL)是指向XML文件(RSS提要),还是指向普通HTML文件,只需查看标题,或者类似的内容(无需下载)

有什么好的建议吗?:)

谢谢! Roey

只要在“文本”阅读器中阅读即可。 然后决定哪一个是最好的,例如,在脑海中寻找一些标签;) 然后把它扔进你真正的阅读器里


还是太简单了?

您可以使用
内容类型
标题,为了节省带宽,您可以强制web服务器为您提供文档的指定部分。如果服务器在其响应中包含
Accept Ranges:bytes
头,则可以使用
Range:bytes=0-10
仅下载前十个字节(甚至尝试不下载任何内容)


另外,研究
HEAD
动词而不是
GET

仅仅通过查看URL,您无法找到它是什么文件类型


我建议您尝试检查您请求的文档的MIME类型,或者阅读第一行并希望作者已输入Doctype。

您可以只执行HEAD请求,而不是完整的POST/GET

这将获得该页面的标题,其中应包括内容类型。 因此,您应该能够区分它是文本/html还是xml


在Eoin Campbell的回答之后,有一个很好的例子,下面是一个代码片段,它应该使用
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)类型,并且正确地发布。但是既然你说你想要一个带宽效率高的方法来做这件事,我想你不想下载所有的标记并分析它!老实说,内容类型通常在任何情况下都是正确设置的。

检查HttpWebResponse对象中的标题。对于xml/RSS文档,内容类型标题应为text/xml;对于标准网页,内容类型标题应为text/html。

一般来说,这是不可能的。这是因为可以(尽管没有帮助)将HTML或XML文件作为应用程序/八位字节流提供。另外,正如其他人所指出的,存在多个有效的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);
但如果你想以某种方式处理它,你可以:

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。我数了一个“可以”和两个“应该”。]的确它确实假设所讨论的Web服务器支持HTTP头请求&如果有的话,内容mimetype的设置是正确的,但我认为这些场景是规则的例外;这正好回答了一半的问题。有一些棘手的内容类型,比如:@bzlm:是的,但是它们真的被使用了吗?我们这里只讨论HTML和XML类型。他明确表示,在下载整个文件之前,他想知道。