Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.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获取远程页面';书名_C#_Asp.net_Http_Httpwebrequest - Fatal编程技术网

C# 使用HTTPWebRequest获取远程页面';书名

C# 使用HTTPWebRequest获取远程页面';书名,c#,asp.net,http,httpwebrequest,C#,Asp.net,Http,Httpwebrequest,我有一个web服务,充当网站群和一些分析软件之间的接口。部分分析跟踪需要获取页面标题。我希望使用HTTPWebRequest调用页面,而不是将其从网页传递到web服务 我有一些代码可以获取整个页面并解析html以获取标题标签,但我不想下载整个页面来获取头部的信息 我从 HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("url"); request.Method = "HEAD"; 好主意,但是请求只返回文档的HT

我有一个web服务,充当网站群和一些分析软件之间的接口。部分分析跟踪需要获取页面标题。我希望使用
HTTPWebRequest
调用页面,而不是将其从网页传递到web服务

我有一些代码可以获取整个页面并解析html以获取标题标签,但我不想下载整个页面来获取头部的信息

我从

HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("url");  
request.Method = "HEAD";

好主意,但是请求只返回文档的HTTP头。这不包括title元素,它是HTTP消息正文的一部分。

好主意,但是请求只返回文档的HTTP头。这不包括title元素,它是HTTP消息正文的一部分。

因此我必须使用类似于

HttpWebRequest req   = (HttpWebRequest)WebRequest.Create(URL);
HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
Stream st            = resp.GetResponseStream();
StreamReader sr      = new StreamReader(st);
string buffer        = sr.ReadToEnd();
int startPos, endPos;
startPos = buffer.IndexOf("<title>",
StringComparison.CurrentCultureIgnoreCase) + 7;
endPos = buffer.IndexOf("</title>",
StringComparison.CurrentCultureIgnoreCase);
string title = buffer.Substring(startPos, endPos - startPos);
Console.WriteLine("Response code from {0}: {1}", s,
        resp.StatusCode);
Console.WriteLine("Page title: {0}", title);
sr.Close();
st.Close();

所以我不得不选择像

HttpWebRequest req   = (HttpWebRequest)WebRequest.Create(URL);
HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
Stream st            = resp.GetResponseStream();
StreamReader sr      = new StreamReader(st);
string buffer        = sr.ReadToEnd();
int startPos, endPos;
startPos = buffer.IndexOf("<title>",
StringComparison.CurrentCultureIgnoreCase) + 7;
endPos = buffer.IndexOf("</title>",
StringComparison.CurrentCultureIgnoreCase);
string title = buffer.Substring(startPos, endPos - startPos);
Console.WriteLine("Response code from {0}: {1}", s,
        resp.StatusCode);
Console.WriteLine("Page title: {0}", title);
sr.Close();
st.Close();

如果你不想请求整个页面,你可以请求它的碎片。http规范定义了一个名为Range的http头。您将按如下方式使用它:

范围:字节=0-100

您可以查看返回的内容并找到标题。如果不存在,则请求范围:101-200,依此类推,直到您得到所需


显然,web服务器需要支持范围,因此这可能是命中或未命中的。

如果您不想请求整个页面,可以分块请求。http规范定义了一个名为Range的http头。您将按如下方式使用它:

范围:字节=0-100

您可以查看返回的内容并找到标题。如果不存在,则请求范围:101-200,依此类推,直到您得到所需

显然,web服务器需要支持范围,因此这可能是偶然的。

尝试以下方法:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.IO;
using System.Text.RegularExpressions;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            string page = @"http://stackoverflow.com/";
            HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(page);
            StreamReader SR = new StreamReader(req.GetResponse().GetResponseStream());

            Char[] buf = new Char[256];
            int count = SR.Read(buf, 0, 256);
            while (count > 0)
            {
                String outputData = new String(buf, 0, count);
                Match match = Regex.Match(outputData, @"<title>([^<]+)", RegexOptions.IgnoreCase);
                if (match.Success)
                {
                    Console.WriteLine(match.Groups[1].Value);
                }
                count = SR.Read(buf, 0, 256);
            }
        }

    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
Net系统;
使用System.IO;
使用System.Text.RegularExpressions;
命名空间控制台应用程序2
{
班级计划
{
静态void Main(字符串[]参数)
{
字符串页=@“http://stackoverflow.com/";
HttpWebRequest req=(HttpWebRequest)HttpWebRequest.Create(第页);
StreamReader SR=新的StreamReader(req.GetResponse().GetResponseStream());
Char[]buf=新字符[256];
int count=SR.Read(buf,0,256);
而(计数>0)
{
String outputData=新字符串(buf,0,计数);
Match Match=Regex.Match(outputData,@)([^试试这个:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.IO;
using System.Text.RegularExpressions;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            string page = @"http://stackoverflow.com/";
            HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(page);
            StreamReader SR = new StreamReader(req.GetResponse().GetResponseStream());

            Char[] buf = new Char[256];
            int count = SR.Read(buf, 0, 256);
            while (count > 0)
            {
                String outputData = new String(buf, 0, count);
                Match match = Regex.Match(outputData, @"<title>([^<]+)", RegexOptions.IgnoreCase);
                if (match.Success)
                {
                    Console.WriteLine(match.Groups[1].Value);
                }
                count = SR.Read(buf, 0, 256);
            }
        }

    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
Net系统;
使用System.IO;
使用System.Text.RegularExpressions;
命名空间控制台应用程序2
{
班级计划
{
静态void Main(字符串[]参数)
{
字符串页=@“http://stackoverflow.com/";
HttpWebRequest req=(HttpWebRequest)HttpWebRequest.Create(第页);
StreamReader SR=新的StreamReader(req.GetResponse().GetResponseStream());
Char[]buf=新字符[256];
int count=SR.Read(buf,0,256);
而(计数>0)
{
String outputData=新字符串(buf,0,计数);

Match Match=Regex.Match(outputData,@“([^那么,有没有办法在不下载整个页面的情况下获取此信息?您可以分块阅读响应,但我认为框架本身可能已经收到了整个响应,即使您尚未处理它。那么,有没有办法在不下载整个页面的情况下获取此信息?嗯,您可以阅读响应是分块的,但我认为框架本身已经收到了整个响应,即使您还没有处理。-1.如果
标记没有关闭怎么办?在所有情况下,您都不应该尝试解析HTML,而是使用现有的、真实的、工作的解析器。-1.如果
标记没有关闭怎么办?总之在这种情况下,您不应该尝试解析HTML,而应该使用现有的、真实的、可工作的解析器。