获取指定网页的远程资源可使用 WebClient、WebRequest、HttpWebRequest 三种方式来实现。当然也可使用webBrowse,webBrowse不做介绍。

  通过 System.Net 名称空间下 WebClient 类下载文件。

        //通过WebClient下载网页的源码
string url = "http://www.example.com";
System.Net.WebClient client = new System.Net.WebClient();
client.Encoding = System.Text.Encoding.UTF8;
string strHtml = client.DownloadString(url);

 综合实例:

using System;
using System.Text; using System.IO;
using System.Net; namespace SnapUtility
{
public class ServerResourceHelper
{
/// <summary>
/// 通过WebClient获取远程资源
/// </summary>
/// <param name="url"></param>
/// <returns></returns>
public static string GetByWebClient(string url)
{
string strReturn = null;
WebClient client = new WebClient();
//client.Headers.Add(HttpRequestHeader.Accept, @"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
//client.Headers.Add(HttpRequestHeader.Referer, null);
//client.Headers.Add(HttpRequestHeader.UserAgent, @" Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36");
//client.Headers.Add(HttpRequestHeader.ContentType, "application/octet-stream"); string strExtension = Path.GetExtension(url); //扩展名
if (String.IsNullOrEmpty(strExtension))
{
Stream stream = client.OpenRead(url);
StreamReader streamReader = new StreamReader(stream, Encoding.GetEncoding("utf-8"));
strReturn = streamReader.ReadToEnd();
streamReader.Close();
stream.Close();
}
else
{
string path = "../WebSnap/DownLoad/";
path = System.Web.HttpContext.Current.Server.MapPath(path); //自动创建文件夹
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
path += DateTime.Now.ToString("hhmmss") + strExtension; client.DownloadFile(new Uri(url), path);
}
client.Dispose();
return strReturn;
} /// <summary>
/// 通过WebRequest获取远程资源
/// </summary>
/// <param name="url"></param>
/// <returns></returns>
public static string GetByWebRequest(string url)
{
string strReturn = null;
Uri uri = new Uri(url);
WebRequest request = WebRequest.Create(uri);
WebResponse response = request.GetResponse();
Stream stream = response.GetResponseStream(); string strExtension = Path.GetExtension(url); //扩展名
if (String.IsNullOrEmpty(strExtension))
{
StreamReader streamReader = new StreamReader(stream, Encoding.GetEncoding("utf-8"));
strReturn = streamReader.ReadToEnd();
streamReader.Close();
stream.Close();
response.Close();
}
else
{
string fileName = DateTime.Now.ToString("hhmmss") + strExtension;
long length = response.ContentLength;
strReturn = SaveFile(ref stream, fileName, length);
}
return strReturn;
} /// <summary>
/// 通过WebRequest的Http特定实现获取远程资源
/// </summary>
/// <param name="url">远程地址</param>
/// <returns></returns>
public static string GetByHttpWebRequest(string url)
{
string strReturn = null;
Uri uri = new Uri(url);
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream stream = response.GetResponseStream(); string strExtension = Path.GetExtension(url); //扩展名
if (String.IsNullOrEmpty(strExtension))
{
StreamReader streamReader = new StreamReader(stream, System.Text.Encoding.GetEncoding("utf-8"));
strReturn = streamReader.ReadToEnd();
streamReader.Close();
stream.Close();
response.Close();
}
else
{
string fileName = DateTime.Now.ToString("hhmmss") + strExtension;
long length = response.ContentLength;
strReturn = SaveFile(ref stream, fileName, length);
}
return strReturn;
} /// <summary>
/// FileStream保存文件
/// </summary>
/// <param name="stream"></param>
private static string SaveFile(ref Stream stream, string fileName, long length)
{
byte[] buffer = new byte[length];
stream.Read(buffer, , buffer.Length);
stream.Close(); string path = AppDomain.CurrentDomain.BaseDirectory + "DownLoad\\" + fileName;
FileStream fileStream = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write);
fileStream.Write(buffer, , buffer.Length);
fileStream.Flush();
fileStream.Close(); return path;
} /// <summary>
/// 保存图片
/// </summary>
/// <param name="stream"></param>
private static string SavePicture(ref Stream stream, string fileName)
{
System.Drawing.Image image = System.Drawing.Image.FromStream(stream);
stream.Close();
string path = "../WebSnap/DownLoad/";
path = System.Web.HttpContext.Current.Server.MapPath(path); //自动创建文件夹
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
path += fileName; image.Save(path, System.Drawing.Imaging.ImageFormat.Png);
image.Dispose(); //释放资源 return path;
}
}
}

注意:

“utf-8”应与指定网页的编码对应。

可以看到HttpWebRequest 方式最复杂,但确提供了更多的选择性。

有的网站检测客户端的UserAgent!如163

C# 之 服务端获取远程资源的更多相关文章

  1. ftpget 从Windows FTP服务端获取文件

    /********************************************************************************* * ftpget 从Windows ...

  2. IE8下服务端获取客户端文件的路径为C:/fakePath问题的解决方案

    上一篇文章上提到,IE8下服务端获取客户端文件的路径时,会变成C:/fakePath问题,于是乎通过文件路径去获得文件大小就失败了. 上网搜了一下,主要原因是IE8因为安全考虑,在上传文件时屏蔽了真实 ...

  3. Android从服务端获取json解析显示在客户端上面

    Android从服务端获取json解析显示在客户端上面 百度经验:jingyan.baidu.com 首先说一下Json数据的最基本的特点,Json数据是一系列的键值对的集合,和XML数据来比,Jso ...

  4. 服务端获取客户端html页面内容-2013-6-28-2

    客户端怎么提交  整个html页面?    分析:      1>我们知道b/s模式,也知道http协议.服务端想要获取客户端的数据,客户端就 必须提交给它,服务器才能获取到.     2> ...

  5. springboot 服务端获取前端传过来的参数7种方式

    下面为7种服务端获取前端传过来的参数的方法  1.直接把表单的参数写在Controller相应的方法的形参中,适用于GET 和 POST请求方式 这种方式不会校验请求里是否带参数,即下面的userna ...

  6. kbengine mmo源码(完整服务端源码+资源+完整客户端源码)

      本项目作为kbengine服务端引擎的客户端演示而写 更新kbengine插件库(https://github.com/kbengine/kbengine_unity3d_plugins):    ...

  7. C#微信小程序服务端获取用户解密信息

    using AIOWeb.Models; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; using System.C ...

  8. 基于NIO的同步非阻塞编程完整案例,客户端发送请求,服务端获取数据并返回给客户端数据,客户端获取返回数据

    这块还是挺复杂的,挺难理解,但是多练几遍,多看看研究研究其实也就那样,就是一个Selector轮询的过程,这里想要双向通信,客户端和服务端都需要一个Selector,并一直轮询, 直接贴代码: Ser ...

  9. c++ 网络编程(四) LINUX/windows下 socket 基于I/O复用的服务器端代码 解决多进程服务端创建进程资源浪费问题

    原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/9613861.html 好了,继上一篇说到多进程服务端也是有缺点的,每创建一个进程就代表大量的运 ...

随机推荐

  1. Jquery Table 的基本操作

    Jquery 操作 Html Table 是很方便的,这里对表格的基本操作进行一下简单的总结. 首先建立一个通用的表格css 和一个 表格Table: table { border-collapse: ...

  2. POJ 1001 Exponentiation

    题意:求c的n次幂……要求保留所有小数…… 解法:一开始只知道有BigInteger……java大数+模拟.第一次写java大数……各种报错各种exception……ORZ 没有前导0和小数后面的补位 ...

  3. 【译】 AWK教程指南

    前面的话: 这几天写了一个程序,在同一个目录里生成了很多文件,需要统计其中部分文件的总大小,发现经常用到的ls.du等命令都无济于事,我甚至都想到了最笨的方法,写一个脚本:mkdir一个新目录,把要统 ...

  4. 使用 EasyBCD 安装Ubuntu 14.04 Error 15: file not found错误的解决方法

    今天安装Window7 和 Ubuntu 14.04 双系统时,出现如下异常,记录一下. 安装过程是参考 http://www.linuxidc.com/Linux/2014-04/100369.ht ...

  5. pollard_rho和Miller_Rabin

    Miller_Rabin就是以概论大小来判断素数 可以判断2^63范围的数 pollard_rho推荐两个很好的博客来理解:整数分解费马方法以及Pollard rho和[ZZ]Pollard Rho算 ...

  6. phpMyAdmin 中数据库替换问题

    将原来的数据库删除,然后进入data文件夹中修改名字, 但是后来前台出现错误: Zend_Db_Statement_Exception Object ( [_previous:Zend_Excepti ...

  7. C++ 虚函数表与内存模型

    1.虚函数 虚函数是c++实现多态的有力武器,声明虚函数只需在函数前加上virtual关键字,虚函数的定义不用加virtual关键字. 2.虚函数要点 (1) 静态成员函数不能声明为虚函数 可以这么理 ...

  8. Java内存管理原理及内存区域详解

    一.概述 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干不同的数据区域,这些区域都有各自的用途以及创建和销毁的时间.Java虚拟机所管理的内存将会包括以下几个运行时数据区域,如下 ...

  9. 【现代程序设计】【Homework-01】

    1维的最大子数组之和 对于1维的最大子数组之和 假设f[i]表示:对于1..i这个序列中,包含i这个元素的最大序列的值 则对于f[i],0<i<=n; 应该有 f[i]=max(a[i], ...

  10. hdoj 2037 今年暑假不AC

    今年暑假不AC Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Sub ...